题意:有n个房子,你要把猫放进房子里,每个房子必须要放一个,猫的身高从1-20;猫有个毛病:身高相同的不能放一起,两个身高相同的之间的猫之间至少得有一只猫的身高比他们的身高小
题解:找规律吧,比如说如果猫的身高为1的话就只能出现一次,2的话就只能出现两次,3只能出现四次(插空)…
比如说:
1只猫:
1
2只猫可以这样:
2 1 2
之后就是:
3 2 3 1 3 2 3
4 3 4 2 4 3 4 1 4 3 4 2 4 3 4…
规律在while循环里面了:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[20];
for(int i=1;i<=18;i++)
{
a[i]=pow(2,i);
}
int ans[1000010];
int k;
for(int i=1;i<=18;i++)
{
if(n<=a[i])
{
k=i+1;
break;
}
}
int t=k;
int top=0;
while(k--)
{
ans[(int)pow(2,top++)]=k+1;
for(int i=pow(2,top-1);i<=pow(2,t);i+=pow(2,top))
{
ans[i]=k+1;
}
}
for(int i=1;i<n;i++)
cout<<ans[i]<<" ";
cout<<ans[n]<<endl;
return 0;
}