跳到主要内容

题解:CF234G Practice

· 阅读需 2 分钟
lailai
Blogger

原题链接

解题思路

kk 人需要 pkp_k 次比赛,下一场比赛将分成 ii 人和 kik-i 人。

显然这 ii 人和 kik-i 人相互独立,不需要额外的比赛,所以 pk=max(pi,pki)+1p_k=\max(p_i,p_{k-i})+1。显然当 i=ki=n2i=k-i=\frac{n}{2},即两队人数均匀时,获得最优解。

每次比赛都至多让两半人相互独立,所以至少需要 k=log2n=log2(n1)+1k=\left\lceil\log_2 n\right\rceil=\left\lfloor\log_2 (n-1)\right\rfloor+1 场比赛。

注意到,任意两个不同的非负整数,至少有一位二进制不同,所以不妨根据第 jj 位二进制进行分组。(0j<k0\le j<k

参考代码

#include <bits/stdc++.h>
using namespace std;

const int N=1005;
int a[N];
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
int k=__lg(n-1)+1;
cout<<k<<'\n';
for(int j=0;j<k;j++)
{
int ans=0;
for(int i=0;i<n;i++)
{
if(!(i>>j&1))ans++;
}
cout<<ans<<' ';
for(int i=0;i<n;i++)
{
if(!(i>>j&1))cout<<i+1<<' ';
}
cout<<'\n';
}
return 0;
}