A. Split the Multiset
很简单的一道题,每次按最高的k给它加上,然后减1就行了
void solve(){
cin>>n>>k;
int sum=1,ans=0;
while(sum<n){
sum+=k-1;ans++;
}
cout<<ans<<endl;
}
B. Make Majority
把两个以上连续的0直接变成一个,最后再统计1和0的数量进行判断
void solve(){
string s;
cin>>n>>s;
int tt=0,sum=0;
for(int i=0;i<s.size();++i){
int j=i;
while(s[j]=='0'){
j++;
}
if(j>i) i=j-1,a[++tt]=0;
if(s[i]=='1') a[++tt]=1;
}
for(int i=1;i<=tt;++i){
if(a[i]==1) sum++;
}
if(sum*2>tt) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
C. Increasing Sequence with Fixed OR
构造题,每一次验算把一个位置的1换成0后的结果能不能符合条件
void solve(){
cin>>n;vector<ll> a;
for(ll i=62;i>=-1;i--){
long long x=1ll<<i;
if((x&n)==x&&x!=n&&n-x>=0){
a.push_back(n-x);
}
}a.push_back(n);
cout<<a.size()<<endl;
for(ll u:a) cout<<u<<" ";cout<<endl;
}