Skip to main content
Original190 words1 min

题解:CF1957B A BIT of a Construction

Summary

构造长度为 n 的非负整数列,满足元素和为 k,使按位或结果中二进制 1 的个数最多。把第 i 位置 1 的代价为 2 的 i 次方,低位代价更小,故从低位到高位尽量给第一个元素补 1,剩余部分全放到第二个元素、其余置 0。特判 n 等于 1 时只能取 k。

题意简述​

构造长度为 nn 的自然数列 aa,满足 ∑ai=k\sum a_i=k,且让数列 aa 按位或结果中二进制 11 的个数最多。

解题思路​

把第 ii 位变成 11 的代价为 2i2^i,显然越低位代价越小,所以要让低位尽可能变成 11。

从低到高遍历第 ii 位,如果能变成 11,就让 a1a_1 加上 2i2^i。

剩下 k−a1k-a_1 没用了,不妨全都放到 a2a_2 上,然后让其他 ai=0a_i=0(3≤i≤n3\le i\le n)。

特别地,当 n=1n=1 时,a1a_1 只能等于 kk。

参考代码​

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

using ll=long long;
const int N=200005;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
if(n==1)
{
cout<<k<<'\n';
continue;
}
int a1=0;
for(int i=0;i<=30;i++)
{
int x=1<<i;
if(a1+x<=k)a1+=x;
}
cout<<a1<<' '<<k-a1<<' ';
for(int i=3;i<=n;i++)cout<<0<<' ';
cout<<'\n';
}
return 0;
}