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
备注:
不保证数据有梯度(但肯定没有极限数据)
分析
贪心地去想,假如两个人在某个位置都是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; } /*样例区 */ //------------------------------------------------------------