您的位置:首页 > 大数据 > 人工智能

Dual horsetail

2015-11-24 15:52 477 查看
题目链接;  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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: