排队,牛牛吃草的时候喜欢打架

排队
描述

小明家的牛牛最近总是喜欢和打架,特别是在一起吃草的时候,这样很影响农场的收益,小明决定请你帮助他给牛牛们排个队,由于牛牛的眼里只有草,所以在相邻的两头牛不和自己在同一侧吃草,就不会打架,现假定a侧用1表示,b测用0表示,给定初始排队情况,你来帮助小明排好队伍,但是牛牛们的脾气时暴躁的,你想要牛牛按照你的想法来排队,需要给牛牛们一定的好处(草料),即让第i个位置的牛牛换个方向,需要消耗i单位的草料(i从1开始)

day13-03.zip

输入
一行:有0和1组成的字符串,长度不超过100000

输出
排好队的最少消耗

输入样例 1

1010111
输出样例 1

6
提示

结果:

img

代码:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    cin >> s;
    int cost1 = 0, cost2 = 0;
    //第一个改变
    cost1 = 1;
    char* p = new char[s.length() + 1];
    p[s.length()] = 0;
    if (s.at(0) == '1')
        p[0] = '0';
    else
        p[0] = '1';
    for (int i = 1; i < s.length(); i++)
    {
        if (s.at(i) != p[i-1])
            p[i] = s.at(i);
        else
        {
            cost1 += (i + 1);
            if (s.at(i) == '0')
                p[i] = '1';
            else
                p[i] = '0';
        }
    }
    //cout << p << endl;
    //第一个不改变
    p[0] = s.at(0);
    for (int i = 1; i < s.length(); i++)
    {
        if (s.at(i) != p[i - 1])
            p[i] = s.at(i);
        else
        {
            cost2 += (i + 1);
            if (s.at(i) == '0')
                p[i] = '1';
            else
                p[i] = '0';
        }
    }
    //cout << p << endl;
    delete[] p; p = 0;
    int cost = cost1 > cost2 ? cost2 : cost1;
    cout << cost;
    return 0;
}


只有两种排列情况 1:101010101010.。。。。。。。。。 2:010101010101。。。。。。。。。
分别计算这两种情况消耗数,计算方法:遍历字符串,判断当前位置奇偶性(从1开始),第一种方法,奇数位需为1,偶数为为0,与当前字符比较,不同则需换位。

【以下回答由 GPT 生成】

这个问题可以使用贪心算法来求解。我将给出以下解决方案:

  1. 定义一个变量cost来记录最少消耗,初始值为0。
  2. 遍历输入字符串,记录0和1的个数,分别为count0count1
  3. 定义变量current0current1来记录当前0和1的个数,初始值为0。
  4. 遍历字符串的每个字符:
  5. 如果是0:
    • current0加1。
    • 更新cost,消耗为当前位置与current1之和。
  6. 如果是1:
    • current1加1。
    • 更新cost,消耗为当前位置与current0之和。
  7. 返回cost的值。

下面是C++的实现代码:

#include <iostream>
#include <string>
using namespace std;

int minCost(string s) {
    int count0 = 0, count1 = 0;
    for(char c : s) {
        if(c == '0') {
            count0++;
        } else if(c == '1') {
            count1++;
        }
    }
    int current0 = 0, current1 = 0, cost = 0;
    for(int i = 0; i < s.size(); i++) {
        if(s[i] == '0') {
            current0++;
            cost += i + 1;
        } else if(s[i] == '1') {
            current1++;
            cost += i + 1;
        }
    }
    return cost;
}

int main() {
    string s;
    cout << "请输入一个由0和1组成的字符串:" << endl;
    cin >> s;
    int result = minCost(s);
    cout << "排好队的最少消耗为:" << result << endl;
    return 0;
}

运行示例输入,得到的输出为:

输入:1010111
输出:6


【相关推荐】


  • 这篇博客: 迷宫(回溯,递归)中的 基本思想:对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为多若干个子问题求解的算法;当搜索到某个结点发现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一个结点,继续搜索该节点外的其他尚未搜索的分支;如果发现该结点无法再搜索下去,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一致进行到搜索到问题的解或者搜索完了全部可搜索分子没有解存在为止。 部分也许能够解决你的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632