题目链接:http://lx.lanqiao.cn/problem.page?gpid=T29
题目大意:给两个串,初始串和目标串,每一位表示硬币的正反状态。一次操作的定义是让两个相邻的硬币反面。问从初始状态到目标状态所需要的最少操作次数是多少。
关键思想:贪心。要知道如果两个串的某一位不同,那这一位必然要经历奇数次操作,而且先翻或者后翻是没有影响的。那你想,既然是奇数次,那么最好的情况就是一次搞定啊。解决方案是有的,也很容易想——从左到右扫描,一旦扫描到一位不同,就执行一次操作,而此后的所有操作不会再影响这个硬币。而且这样子的话,后面本来需要进行操作的可能顺便和前面的一次做了。也容易理解这种情况就是操作次数做少的。
代码如下:
#include <iostream> #include <algorithm> using namespace std; int main(){ string a,b; cin>>a>>b; int cnt=0; for(int i=0;i<a.size();i++){ if(a[i]!=b[i]){ a[i+1]=a[i+1]==‘*‘?‘o‘:‘*‘; cnt++; } } cout<<cnt<<endl; return 0; }
时间: 2024-10-08 20:50:31