水题
#include<bits/stdc++.h>
using 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";
}
有点像某年蓝桥杯省赛的一道题,横向思维即可
#include<bits/stdc++.h>
using 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<<res;
}
首先分析题意,易知a的长度一定不大于b的长度
分情况:当a的长度小于b,直接从最高位输出即可
当a的长度等于b,这里最初的思路有问题,起初是先输出相等位,然后输出一位小于b对应位的最大值,没有考虑到剩下位数中没有比b更小的情况,正确思路应该直接分情况搜索
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b;
int w[15];
int kb[20],kc;
int ca;
vector<int> 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<<i,w[i]--;
}
else if(ca==kc)
{
dfs(1,false);
for(int i=res.size()-1;i>=0;i--)
cout<<res[i];
}
/* while(w[kb[kc]])
{
cout<<kb[kc];
w[kb[kc]]--;
kc--;
}
for(int i=kb[kc];i>=0;i--)
if(w[i])
{
cout<<i;
w[i]--;
break;
}
for(int i=9;i>=0;i--)
while(w[i]) cout<<i,w[i]--;
}
*/
}