bzoj P1192

这题给的数据很大,所以暴力模拟肯定是不行的。。

dp也不行,数据范围达到了10^9,所以保存不了状态。。。

所以其实是道数学题,可以用简单的找规律来解决:

设f[i]为当m为i时的解,接下来开始手算:

f[1]=1,f[2]=2,f[3]=2,f[4]=3,f[5]=3,f[6]=3....

是不是看出了什么??

对于f[1],重复1的值1次

对于f[2],重复2的值2次

对于f[4],重复3的值3次

以此类推。。。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int m,i;
int main(){
scanf(
"%d",&m);
for(i=1;(1<<i)<=m+1;i+=1);
i
--;
if((1<<i)!=m+1) printf("%d",i+1);
else printf("%d",i);
return 0;
}