题目大意:将编号为1~n的n个人分成两组(每组至少1人),求至少分多少次组,能满足任意取两个人,这两个人必存在被分到过不同的组。
模拟:
#include<cstdio>
const int N=1002;
int a[12][N],cnt[12];
void dfs(int l,int r,int d)
{
int i,m=(l+r)>>1;
for(i=l;i<=m;i++)a[d][cnt[d]++]=i;
if(l<r)
{
dfs(l,m,d+1);
dfs(m+1,r,d+1);
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,i,j,ans;
while(~scanf("%d",&n))
{
for(ans=1;1<<ans<n;ans++);
for(i=1;i<=ans;i++)cnt[i]=0;
printf("%d\n",ans);
dfs(1,n,1);
for(i=1;i<=ans;i++)
{
printf("%d",cnt[i]);
for(j=0;j<cnt[i];j++)printf(" %d",a[i][j]);
puts("");
}
}
return 0;
}
位运算:
#include<cstdio>
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,i,j,ans,cnt;
while(~scanf("%d",&n))
{
for(ans=1;1<<ans<n;ans++);
printf("%d\n",ans);
for(i=0;i<ans;i++)
{
cnt=0;
for(j=0;j<n;j++)if(1<<i&j)cnt++;
printf("%d",cnt);
for(j=0;j<n;j++)if(1<<i&j)printf(" %d",j+1);
puts("");
}
}
return 0;
}