题目描述
从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。现在要求从这行的第一个硬币开始,将前若干个硬币一起翻面,问如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?
输入格式
一个字符串,由0和1组成,表示硬币状态
输出格式
一个数,表示要翻转的最少次数
输入输出样例
输入 #110输出 #1
2
说明/提示
样例1说明:
第1次翻转:把第一个硬币翻到反面,字符串为00
第2次翻转:把第一、二个硬币一起翻到正面,字符串为11,翻转完成,输出2
硬币个数<=10000
【解题思路】
读入表示硬币状态的字符串,要把硬币都翻到1。翻转有一定的规则,如果你要翻第i枚硬币,必须把1~i枚都翻转。问怎么翻才能用最少的次数得到全部为1的硬币序列。
既然是翻1~i的话,连续的0可以一次变为1,就可以当成一个0处理。但是如果0前有1,就要再操作一次把翻成0的1翻回去。当我们找到一个0,如果它前面也是0,我们可以不管它,和前面的0一起处理。如果它前面是1,就要翻2次纠正。要做到次数最少,我们就要使调整好的状态不受影响,所以应该从后向前搜索,而翻转后面的操作实际不影响前面的值,因为前面的硬币会翻2次回到原状态。最后要再判断一下第一枚硬币,如果是0再翻1次。
【code】
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,ans; char a[10005]; int main(){ scanf("%s",a+1); n=strlen(a+1); for(register int i=2;i<=n;i++) if(a[i]!=a[i-1]) ans++; if(a[n]=='0')ans++; printf("%d\n",ans); return 0; }
标签:硬币,int,翻转,字符串,include,朝上 来源: https://www.cnblogs.com/66dzb/p/11480752.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。