4305. 斐波那契字符串 - AcWing
水题
#includeusing namespace std; typedef long long ll; int n; int a=1,b=1; bool st[1005]; int main() { int k=a+b; st[1]=true; while(k<1005) { st[k]=true; a=b,b=k; k=a+b; } cin>>n; for(int i=1;i<=n;i++) if(!st[i]) cout<<"o"; else cout<<"O"; }
4306. 序列处理 - AcWing
有点像某年蓝桥杯省赛的一道题,横向思维即可
#includeusing namespace std; typedef long long ll; int n; int res; int w[3005]; bool vis[50005]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>w[i]; if(!vis[w[i]]) vis[w[i]]=true; else { while(vis[w[i]]) w[i]++,res++; vis[w[i]]=true; } } cout< 4307. 数字重构 - AcWing
首先分析题意,易知a的长度一定不大于b的长度
分情况:当a的长度小于b,直接从最高位输出即可
当a的长度等于b,这里最初的思路有问题,起初是先输出相等位,然后输出一位小于b对应位的最大值,没有考虑到剩下位数中没有比b更小的情况,正确思路应该直接分情况搜索
#includeusing namespace std; typedef long long ll; ll a,b; int w[15]; int kb[20],kc; int ca; vector res; void op(ll x,ll y) { while(x) { w[x%10]++; x/=10; ca++; } for(kc=1;y;kc++) kb[kc]=y%10,y/=10; kc--; reverse(kb+1,kb+kc+1); } bool dfs(int u,bool flag)//第u位 是否已经比b小 { if(u==kc+1) return true; if(!flag&&w[kb[u]]) { w[kb[u]]--; if(dfs(u+1,false)) { res.push_back(kb[u]); return true; } w[kb[u]]++; } if(!flag) { for(int i=kb[u]-1;i>=0;i--) { if(!w[i]) continue; w[i]--; if(dfs(u+1,true)) { res.push_back(i); return true; } w[i]++; } } else { for(int i=9;i>=0;i--) { if(!w[i]) continue; w[i]--; if(dfs(u+1,true)) { res.push_back(i); return true; } w[i]++; } } return false; } int main() { cin>>a>>b; op(a,b); if(kc>ca) { for(int i=9;i>=0;i--) while(w[i]) cout<=0;i--) cout<



