【CF】1772E-Permutation Game 题解
传送门:1772E
标签:博弈(专题)
题目大意
给定一个数n,再给出一种1到n的排列,两个人正对此展开博弈。初始时排列中的所有数都是红色的,两人可以轮流对该排列进行操作,但只能选择以下的某一种:
1、选择一个红色的数,将其变为蓝色。
2、不限次数地选择两个蓝色的数,交换它们的位置。
3、跳过该回合。
第一个人获胜的条件是使该排列整体升序,第二个人获胜的条件是使该排列整体降序。问:若两人都采取最优策略,谁会取胜?
输入:T(测试组数),n,1~n的一种排列。
输出:第一个人获胜输出"First",第二个人获胜输出"Second",无法分出胜负则输出"Tie"。
算法分析
- 这是一道经典的博弈题,我们需要先深入分析双方的获胜条件。一个人要升序,另一个人要降序,在每回合操作不确定的情况下讨论似乎很复杂。事实上我们模拟一下就会发现:两人的最优策略是不会相互影响的,也就是说一个人的选择并不会改变另一个人的下一步选择。这是因为“交换两个蓝色的数”这个操作可以在一个回合中进行无限次,这就意味着我们只要把需要交换的数全部标记为蓝色,最后只要用一个回合就可以全部排好序。
- 那么需要交换的数是哪些数呢?以第一个人为例,如果一个数i不是排列中的第i个数,那它显然是需要换位置的。按照最优策略,已经在“正确位置”的数是不会被标记为蓝色的,这样才能节省步数,更快取胜。但为什么说两人的最优策略不会相互影响呢?如果第二个人把第一个人没标记的数的位置改变了,不就破坏了第一个人的计划吗。非也,能进行换位操作的数必然是蓝色的,只要它是蓝色的,第一个人就能在最后一个回合让它回到原位。也就是说蓝色的数多多益善,第二个人无论是进行什么操作都不会减慢第一个人取胜的脚步。
- 我们再讨论无法分出胜负的情况。这里我为什么不说是平局,而要说不分胜负呢?说到平局我们一般会以为是两人同时达到获胜条件,但这场比赛是回合制,操作有先后性。本着以小见大的原则,我们先构造一种简单的情况:n=3,排列为[2,3,1],现在数字2和1都被标记了,轮到第一个人的回合,显然他不会选操作一,因为一旦数字3被标记,下一个回合第二个人就能通过操作二直接取胜。他也不会选操作二,因为在他的最优策略里3必须被标记,否则排序毫无意义。那么他只能跳过这个回合,而第二个人也是如此。也就是说,如果标记剩下的数对双方都有利,且双方都只差这几个共同的数就能取胜,那么就会出现僵持不下、无法分出胜负的局面。
- 现在再去判断谁会取胜,就显得容易多了。只要一个人已经标记完了最优策略里所有数,另一个人还没标记完除公共数以外的“私有数”,就能分出胜负。但还要考虑到第一个人是先手,所以有一定的优势。具体来说,假设第一个人需要标记x个数,第二个人需要标记y个数,x和y的交集有d个数,那么第一个人获胜的条件就是x<=y-d,第二个人获胜的条件是y<x-d。
代码实现
#include <iostream>
using namespace std;
#include <map>
map<int,bool> mp;//记录是否被第一个人标记
int main(){int i,j,x,cnt,cnt1,cnt2,n,T;std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);cin>>T;while(T--){cin>>n;mp.clear();cnt=cnt1=cnt2=0; for(i=1;i<=n;i++){cin>>x;if(x!=i){ //如果是第一个人需要标记的数 mp[x]=1;cnt++; //第一个人的“私有数” }if(x!=n-i+1){//如果是第二个人需要标记的数 if(mp[x]){//已经被标记过 cnt--;cnt2++;//共有数 }else cnt1++;//第二个人的“私有数” }}if(cnt+cnt2<=cnt1)cout<<"First"<<'\n';//先手有优势,所以要加等号 else if(cnt1+cnt2<cnt)cout<<"Second"<<'\n';else cout<<"Tie"<<'\n';}
}
【CF】1772E-Permutation Game 题解相关推荐
- D. New Year and the Permutation Concatenation 题解翻译+思路解释(官方为主,我为补充)+普通人能看得懂的代码(我照着思路写的哈哈哈)
传送门:http://codeforces.com/contest/1091/problem/D There are two types of subarrays with length n: 有两种 ...
- April Fools Contest 2018[cf 愚人节专场题解]
大家一起打愚人节的比赛还是挺有意思的!~~ 然而没有学弟留下来打比赛真是有点点小遗憾呢~ A:题目不要怕,只要胆子大 %2就好了 B: 给了两只猫,每只猫分为九个部分,有部分相同,有部分不同,你去摸猫 ...
- Good Bye 2018题解
Good Bye 2018题解 题解 CF1091A [New Year and the Christmas Ornament] 打完cf都忘记写题解了qwq 题意就是:给你一些黄,蓝,红的球,满足蓝 ...
- Educational Codeforces Round 131 (Rated for Div. 2) A-D题解
题目 A. Grass Field B. Permutation C. Schedule Management D. Permutation Restoration A. Grass Field 题解 ...
- Codeforces Round #532 (Div. 2) F. Ivan and Burgers(可持久化异或线性基+双指针)
题意 给n个数,q组询问,每次询问l到r的最大异或和 思路来源 某cf奆神代码 题解 本来应该是线性基上分治的 这里一发基数+贪心也能过 真是神仙代码啊 双指针的经典应用: 对于每个询问[l,r],r ...
- 1728 problem B
B. Best Permutation 文章目录 B. Best Permutation 题意 题解 题意 Let's define the value of the permutation pp o ...
- The 2022 ICPC Asia Regionals Online Contest (II) A、B、E、F、G、J、L
文章目录 A-Yet Another Remainder 题目 题解 B-Non-decreasing Array 题目 题解 E-An Interesting Sequence 题目 题解 F-In ...
- cf 1512 E. Permutation by Sum
cf 1512 E. Permutation by Sum 题意: 我们定义排列的概念为:从1到n的整数组成的序列,每个数字只出现一次 现在给你n,l,r,s,让你构造一个长度为n的排列,使得其中的第 ...
- 【cf】Codeforces 题解等汇总
[cf]Codeforces Round #774 (Div. 2) 前4题 [cf]Codeforces Round #774 (Div. 2) 前4题_legend_yst的博客-CSDN博客 [ ...
最新文章
- 阿里巴巴为什么不建议直接使用Async注解?
- java 文件夹删除_java创建删除文件及文件夹大全
- jmeter正则表达式提取器多模块相互调用
- 多所高校通知,新学期延期开学!做好线上教学准备
- 数据科学入门与实战:玩转pandas之一
- Java 11 中 11 个不为人知的瑰宝
- 独家 | 一文读懂语音识别(附学习资源)
- PMP考试今年改革吗?
- Linux—RAID磁盘阵列与阵列卡
- _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringB5cxx11Ev
- 全天下最经典的句子,2013重现!
- 红颜弹指老,刹那芳华(转载 作者:程灵素)
- wordpress mysql 密码重置_WordPress登录密码找回办法之修改数据库篇 | Wopus
- 【产品笔记】2.互联网产品修炼
- 南方科技大学计算机系图灵班,【独家】上了大学就自由了,老师管得少! 这所高校:喔?是吗?...
- 花式栈溢出技巧之frame faking
- Variable Generator/dense/kernel already exists, disallowed.
- windows下的300个免费软件
- 使用scrapy框架抓取手机商品信息(2)
- 戴森球计划 超级计算机,戴森球计划steam版