首页 > 代码库 > 蓝桥杯 [翻硬币] 贪心

蓝桥杯 [翻硬币] 贪心

题目链接: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;
} 

 

蓝桥杯 [翻硬币] 贪心