游酷盛世笔试

小红的01串 坏串“010” “101”  每次可以翻转1位,求坏串变成好串需要的最少翻转次数
#include <iostream>
#include <string>
using namespace std;

bool isTrue(string&amp; s, int&amp; err) {
    for (unsigned long i = 0; i < s.size() ; i++) {
        if (s[i] == '0') {
            if (s.substr(i, 3) == &quot;010&quot;) {
                err = i;
                return false;
            }
        }
        if (s[i] == '1') {
            if (s.substr(i, 3) == &quot;101&quot;) {
                err = i;
                return false;
            }
        }
    }
    return true;
}

int reverse(string&amp; s, int&amp; err, int&amp; count) {
    if (isTrue(s, err)) {
        return 0;
    }
    int idx = err+1;
    if (s[err] == '1') {
        s[idx] = '1';
    } else {
        s[idx+1] = '1';
    }
    count++;
    // cout <<&quot;reverse:&quot; <<s<<endl;
    reverse(s, err, count);
    return 0;
}
int main() {
    int a;
    cin >> a;
    string s = to_string(a);
    int err = 0, count = 0;
    reverse(s, err, count);
    cout<<count;
}
// 64 位输出请用 printf(&quot;%lld&quot;)
全部评论
我的解法是考虑每个位置,当他左右元素和他不相等时再判断(101 010)然后,如果i+2没有越界,再往后考虑一个字符 如果和当前相同(1010)就把后面一位置反(1000),这样就可以同时处理两个坏串(原串假如是10101,改为11101会多处理一次,改成10001就不用处理第二次) 如果不同(1011)就考虑把当前字符置反(1111),同理 这样是防止出现额外的坏串(如10110,假如和上面的情况一样,改为10010,会造成出现新的坏串,改为11110就不会出现)
2 回复 分享
发布于 03-19 01:34 北京
你这个是不是不对啊
点赞 回复 分享
发布于 03-18 21:57 湖北

相关推荐

09-10 21:13
门头沟学院 Java
第一题:&nbsp;把数组排序后dp,dp[i]代表从1到i最多可以保留几个数。遍历数组,二分查找左边第一个差值大于d的数,假如二分出来下标为j,直接dp[i]&nbsp;=&nbsp;dp[j]&nbsp;+&nbsp;1。dp之后扫一遍dp数组取全局最大值,答案就是n减去这个全局最大值。注意如果删掉数量为奇数的话,答案得减一第二题:首先对于字符串第一个plog一定是不会被评论的,由此可得只要轮数足够多,所有与第一个plog不同的plog一定会被删除,所以把答案设置为第一个连续的字符的长度。通过观察可得,可以定义一个变量x,遇到一个不同于第一个plog的plog加一,遇到相同的话,如果x大于0就把x减一,否则就把答案减一。第三题:由题可得这是一棵树。如果x&gt;=y,显然可以一个一个节点炸,输出n*x就行。否则我们要让使用操作2的次数尽可能多。要让操作2尽可能多的话,就要通过使用操作一把连通块数量变得尽可能多。这可以用树上dp作。定义dp[u][0]为对该节点使用操作1,dp[u][1]是不使用,以u为根节点得到的子树内最大连通块的数量。对每个节点初始化&nbsp;dp[u][1]&nbsp;=&nbsp;1,&nbsp;dp[u][0]&nbsp;=&nbsp;0转移时通过dfs,对于所有子节点v,有:dp[u][0]&nbsp;&nbsp;=&nbsp;sum(max(dp[v][0]),&nbsp;dp[v][1]));dp[u][1]&nbsp;=&nbsp;sum(max(dp[v][0]),&nbsp;dp[v][1]&nbsp;-&nbsp;1));使用操作2最大次数就是max(dp[root][1],&nbsp;dp[root][0]),这个次数乘y加上剩余节点数乘x就是答案了
投递小红书等公司10个岗位
点赞 评论 收藏
分享
评论
2
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务