Dual horsetail

来源:互联网 发布:msp430编程软件 编辑:程序博客网 时间:2024/06/03 19:02

题目链接;  http://acm.fafu.edu.cn/problem.php?id=1564


题意:给一个数n,输出n被分成最小的集合数,要求集合里任意的X,Y,X&Y不能在同一个集合内

思路:找规律,发现每个数的二进制1的数量一样多的分到同一个集合,结果就为小于等于n的二进制1数量的最大值

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
int a[33];
int main()
{
int T,t=0;
scanf("%d",&T);
for(t=1;t<32;t++)
a[t]=(1<<t) - 1;
t=0;
while(T--)
{
t++;
int n;
scanf("%d",&n);
int i;
for(i=1;i<32;i++)
{
if(n<a[i])
break;
}
printf("Case #%d: %d\n",t,i-1);
}
return 0;
}


0 0