zoukankan      html  css  js  c++  java
  • CodeForces-1215D Ticket Game 博弈,思维

    CodeForces-1215D Ticket Game 博弈,思维

    题意

    给定一个长度为偶数的字符串,由数字和('?')组成。

    两人开始轮流对('?') 填数字,先手希望左边的和和右边的和最终不相等,后手希望相等。

    问谁必胜

    分析

    显然从条件可以看出来这题的结果应该和每边的初始大小以及每边的初始问号个数有关。

    如果左边问号个数等于右边问号个数,仅当左边的和等于右边和相等才会后手赢,否则先手赢。

    再考虑一般情况,首先可以推理出左右的括号是可以抵消的,因为先手为了破坏平衡,总会在初始大的一边加9,而后手能做的也只是在另一边加9减小破坏。

    所以最终可以归结为一边为问号的情况,那么就简单了。

    后手能做的就是维持两者的和为9,所以如果(del / 2 cdot 9 = sum) ,就表明可以维持

    代码

    char s[200005];
    int cnt1, cnt2;
    int sum1, sum2;
    
    int main() {
        int n = readint();
        scanf("%s", s);
        int len = strlen(s);
        for (int i = 0; i < len; i++)
            if (i < len / 2)
                if (s[i] == '?') cnt1++;
                else sum1 += s[i] - '0';
            else {
                if (s[i] == '?') cnt2++;
                else sum2 += s[i] - '0';
            }
        if (cnt1 == cnt2) {
            if (sum1 == sum2) puts("Bicarp");
            else puts("Monocarp");
        }
        else {
            if (sum1 > sum2) {
                int del = cnt2 - cnt1;
                if (del / 2 * 9 == sum1 - sum2) puts("Bicarp");
                else puts("Monocarp");
            }
            else {
                int del = cnt1 - cnt2;
                if (del / 2 * 9 == sum2 - sum1) puts("Bicarp");
                else puts("Monocarp");
            }
        }
    }
    
  • 相关阅读:
    2019-11-4:渗透测试,bypass学习,笔记
    2019-11-3:渗透测试,基础学习,bypass类型笔记
    Linux常用命令集合
    HBase(0.96以上版本)过滤器Filter详解及实例代码
    Hadoop安全模式
    Linux学习笔记--一些错误的记录
    GUG记录
    为什么 1000 == 1000会返回false,100 == 100会返回true
    关于解决mysql数据库乱码的问题
    《MVC实现用户权限》
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13614815.html
Copyright © 2011-2022 走看看