AB已AC CD全A
C
问题描述
给你一个由n 个正整数组成的数组 。你可以对它进行如下运算。在一次操作中,你可以用ai除以2的向下取整的部分代替ai。数组包含了从1到n的所有字,每个数字都恰好包含一次。
程序实现
for(int i=1;i<=n;i++){
cin>>a[i];
while(a[i]>n) a[i]/=2;
f[a[i]]++;
}
for(int i=n;i>=1;i--){
if(!f[i]){
cout<<"NO";
return 0;
}
f[i/2]+=f[i]-1;
}
cout<<"YES";
return 0;
D
问题描述
你可以用1到k中的颜色给一些字母涂色。没有必要将所有字母都涂上颜色。但每种颜色都必须有一个字母涂成该颜色。然后,你可以任意调换涂有相同颜色的两个字母,调换的次数不限。你的任务是给字符串中的字符着色,使生成的所有 字符串都是回文字符串,并且这些 字符串中最短的字符串的长度尽可能大。
程序实现
ll t;
cin>>t;
while(t--){
ll n,k;
string s;
cin>>n>>k;
cin>>s;
memset(a,0,sizeof a);
for(int i=0;i<s.size();i++){
a[s[i]]++;
}
ll even=0,odd=0;
for(int i='a';i<='z';i++){
even+=a[i]/2;
odd+=a[i]%2;
}
ll ans=(even/k)*2;
odd+=2*(even%k);
if(odd>=k){
ans++;
}
cout<<ans<<endl;
}
return 0;
}