1050 硬币游戏 博弈论-贪心

链接:https://ac.nowcoder.com/acm/problem/18993
来源:牛客网

题目描述

 有一天clccle在机房里和sarlendy玩游戏,游戏的规则是这样的,在clccle和sarlendy的面前有两行长度为2n的硬币序列,共4n枚硬币,从clccle开始取,每次只能取两个人之前都没取过的位置的硬币,如果所取硬币朝上(U)的话记为1,所取硬币朝下(D)的话记为0,这样n次后两个人就得到了长度为n的数字串,谁的数字大谁就赢了,当然也存在平局的情况,当然这两个人都非常的睿智,现在clccle想知道,Ta有没有必胜策略?如果有的话就输出“clccle trl!”,没有的话输出“sarlendy tql!”,特别的,平局输出“orz sarlendy!”。

输入描述:

第一行,一个数字n(N<=1000000)
第二,三行,每行各一个长度为2n的字符串

输出描述:

一行 输出   clccle trl!或sarlendy tql!或orz sarlendy!
示例1

输入

复制
3
UDUDUU
DUDUUD

输出

复制
clccle trl!

说明

clccle先取5,sarlendy取4,clccle取6,sarlendy取2,clccle取1,sarlendy取3
此时clccle得到的数字为111,sarlendy得到的数字为110
因为111>110 所以说输出clccle trl!

备注:

不保证数据有梯度(但肯定没有极限数据)

 

分析

贪心地去想,假如两个人在某个位置都是U,那肯定先占掉。

所以计算两个人都是U的位置的个数。如果是奇数,那先手肯定能多占掉一个,若果是偶数,先手和后手都能占掉一样多个。

最后单纯比较一下那边U多一点就可以了。


//-------------------------代码----------------------------

//#define int ll
const int N = 1e5+10;
int n,m;

void solve()
{
    cin>>n;
    string a,b;
    cin>>a>>b;
    int d1 = 0,d2 = 0,com = 0;
    for(int i = 0;i<a.size();i++) {
        if(a[i] == 'U')d1 ++ ;
        if(b[i] == 'U')d2 ++ ;
        if(a[i] == 'U' && b[i] == 'U')com ++ ;
    }
    if(com & 1) {
        d1 += 1;
    }
    
        if(d1 > d2) {
            cout<<"clccle trl!";
        } else if( d1 == d2) {
            cout<<"orz sarlendy!";
        } else {
            cout<<"sarlendy tql!";
        }
}

signed main(){
    clapping();TLE;

//    int t;cin>>t;while(t -- )
    solve();
//    {solve(); }
    return 0;
}

/*样例区


*/

//------------------------------------------------------------

 

posted @ 2022-07-30 22:33  er007  阅读(69)  评论(0编辑  收藏  举报