Codeforces Round #656 (Div. 3) 参与排名人数11542 早睡早起身体好
[codeforces 1385D] a-Good String 每次都面临两种选择(练习递归的好题)
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1385/problem/D
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
D - a-Good String | GNU C++17 | Accepted | 31 ms | 4000 KB |
题目大意:用递归方式构造字符串。在给出字符串的基础上,问要构造符合题意的字符串,需要改变的最小字母个数。
基本思路:每次都面临两种选择(练习递归的好题)
有递归的基础,直接看代码,应该能看懂。
AC代码如下:
#include
#include
#define maxn 140000
using namespace std;
char s[maxn];
int dfs(int l,int r,char c){
int cnt1=0,cnt2=0,mid,i;
if(l==r)return s[l]!=c;//只剩一个字母
mid=(l+r)/2;
for(i=l;i<=mid;i++)cnt1+=s[i]!=c;//一种选择
for(i=mid+1;i<=r;i++)cnt2+=s[i]!=c;//另一种选择
return min(cnt1+dfs(mid+1,r,c+1),cnt2+dfs(l,mid,c+1));//两种选择进行比较
}
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
scanf("%s",s+1);
printf("%d\n",dfs(1,n,'a'));
}
return 0;
}
类似题目:
[codeforces 1353D] Constructing the Array 分治算法