zoukankan      html  css  js  c++  java
  • 9.1练习题2 硬币翻转 题解

    题目出处:洛谷 P2708

    题目描述

    从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。现在要求从这行的第一个硬币开始,将前若干个硬币一起翻面,问如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?

    输入格式

    一个字符串,由0和1组成,表示硬币状态。

    输出格式

    一个数,表示要翻转的最少次数。

    样例输入

    10
    

    样例输出

    2
    

    题目分析

    我们假设连续的一串 '0' 或者连续的一串 '1' 是一段,我们只需要找到有多少段就可以了。
    那么假设现在有 (cnt) 段,这个时候我们需要去判断最后一段是由 '0' 组成的还是由 '1' 组成的。
    如果最后一段是由 '1' 组成的,那么答案就是 (cnt-1) ; 如果最后一段是由 '0' 组成的,那么答案是 (cnt)
    为什么呢?

    • 想象一下都是 '1' 的一个字符串,此时 (cnt=0) ,我们不需要翻转,所以答案就是 (0)
    • 想象一下都是 '0' 的一个字符串,此时 (cnt=0) ,但是我们也需要翻转一次才能让它全部为正,所以答案就是 (1)

    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 10010;
    int n, cnt;
    char ch[maxn];
    int main() {
        cin >> ch;
        n = strlen(ch);
        for (int i = 1; i < n; i ++) if (ch[i] != ch[i-1]) cnt ++;
        if (ch[n-1] == '0') cnt ++;
        cout << cnt << endl;
        return 0;
    }
    
  • 相关阅读:
    Ibatis入门基本语法(转) good
    zip文件压缩(转)
    联合创始人股权分配,五五分是最糟糕的做法(转)
    家长如何检查孩子的家庭作业
    oracle存储过程实例
    MachineKey
    写写我那天參加过的《文明之光》书友会
    各种加解密算法比較
    算法分析---查找最大回文子串
    随机数是骗人的,.Net、Java、C为我作证
  • 原文地址:https://www.cnblogs.com/zifeiynoip/p/11482986.html
Copyright © 2011-2022 走看看