Codeforces Round #585 (Div. 2) D. Ticket Game

链接:

https://codeforces.com/contest/1215/problem/D

题意:

Monocarp and Bicarp live in Berland, where every bus ticket consists of n digits (n is an even number). During the evening walk Monocarp and Bicarp found a ticket where some of the digits have been erased. The number of digits that have been erased is even.

Monocarp and Bicarp have decided to play a game with this ticket. Monocarp hates happy tickets, while Bicarp collects them. A ticket is considered happy if the sum of the first n2 digits of this ticket is equal to the sum of the last n2 digits.

Monocarp and Bicarp take turns (and Monocarp performs the first of them). During each turn, the current player must replace any erased digit with any digit from 0 to 9. The game ends when there are no erased digits in the ticket.

If the ticket is happy after all erased digits are replaced with decimal digits, then Bicarp wins. Otherwise, Monocarp wins. You have to determine who will win if both players play optimally.

思路:

考虑两半, 如果和相等, 则?树也要相等.
如果l>r, 则l的问号要小于r,同时两边的问号差为sub, 考虑为了补充右边等于左边, 如果左边较小则填较大使其不成立, 较大则填较小.所有只有差值为sub/2*9时成立.
这样两人一起的贡献和为9.正好填充相等.

代码:

#include <bits/stdc++.h>
using namespace std;

string s;
int n;

int main()
{
    cin >> n;
    cin >> s;
    int sum1 = 0, sum2 = 0, num1 = 0, num2 = 0;
    for (int i = 0;i < n;i++)
    {
        if (i < n/2)
        {
            if (s[i] == '?')
                num1++;
            else
                sum1 += s[i]-'0';
        }
        else
        {
            if (s[i] == '?')
                num2++;
            else
                sum2 += s[i]-'0';
        }
    }
    if (sum1 < sum2)
        swap(sum1, sum2), swap(num1,num2);
    if (sum1 == sum2)
    {
        if (num1 == num2)
            puts("Bicarp");
        else
            puts("Monocarp");
        return 0;
    }
    if (num1 > num2)
    {
        puts("Monocarp");
        return 0;
    }
    int need = sum1-sum2;
    int own = ((num2-num1)/2)*9;
    if (need != own)
        puts("Monocarp");
    else
        puts("Bicarp");

    return 0;
}

原文地址:https://www.cnblogs.com/YDDDD/p/11634901.html

时间: 2024-11-11 00:36:44

Codeforces Round #585 (Div. 2) D. Ticket Game的相关文章

CodeForces Round #585 (Div 2)

score:1336 (-45), pupilRank: 3313(又炸了,没啥好说的..) B.http://codeforces.com/contest/1215/problem/B 这个题万万没想到是dp,我的天,一开始直接上暴力,没仔细分析时间复杂度,估计是最近网络赛暴力惯了,没缓过神来... 分析见代码: 1 /* 2 设pos[i]表示以i为结尾的正区间,neg[i]表示以i为结尾的负区间.状态转移很容易了,见代码 3 这次真的wa到自闭了,后来改了改竟然又tle,真的自闭到家...

Codeforces Round #585 (Div. 2) B. The Number of Products

题目地址:http://codeforces.com/contest/1215/problem/B 题意:给你一个值都不为零的数组,分别找出有多少个连续的子串乘积小于零,大于零. 我的思路:先找出为正数的基础子串x个,即单个正数或两个负数连起来的子串算一个,可算得...算了一直wrong在样例7.还没想出来那错了,就不写了. 别人家的思路:从首开始找负数字串,即有一个负数后,在下一个负数前这里面的都是负数子串.而其他的就为正数子串,正数子串初始化应为1,所以得的正数子串最后应加上1.两个负数作为

Codeforces Round #585 (Div. 2) CF1215A~C

CF1215A. Yellow Cards简单的模拟,给定了黄票张数,判断最少和最多有多少人被罚下场. #include <bits/stdc++.h> using namespace std; int main() { int a,b,aa,bb,n,nnn; cin>>a>>b>>aa>>bb>>n; nnn=n; int t=(aa-1)*a+(bb-1)*b; int tt=0; if(aa<=bb) { if(n>

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除

Codeforces Round #339 (Div. 2) B. Gena&#39;s Code

B. Gena's Code It's the year 4527 and the tanks game that we all know and love still exists. There also exists Great Gena's code, written in 2016. The problem this code solves is: given the number of tanks that go into the battle from each country, f