传送门: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 题解相关推荐

  1. D. New Year and the Permutation Concatenation 题解翻译+思路解释(官方为主,我为补充)+普通人能看得懂的代码(我照着思路写的哈哈哈)

    传送门:http://codeforces.com/contest/1091/problem/D There are two types of subarrays with length n: 有两种 ...

  2. April Fools Contest 2018[cf 愚人节专场题解]

    大家一起打愚人节的比赛还是挺有意思的!~~ 然而没有学弟留下来打比赛真是有点点小遗憾呢~ A:题目不要怕,只要胆子大 %2就好了 B: 给了两只猫,每只猫分为九个部分,有部分相同,有部分不同,你去摸猫 ...

  3. Good Bye 2018题解

    Good Bye 2018题解 题解 CF1091A [New Year and the Christmas Ornament] 打完cf都忘记写题解了qwq 题意就是:给你一些黄,蓝,红的球,满足蓝 ...

  4. Educational Codeforces Round 131 (Rated for Div. 2) A-D题解

    题目 A. Grass Field B. Permutation C. Schedule Management D. Permutation Restoration A. Grass Field 题解 ...

  5. Codeforces Round #532 (Div. 2) F. Ivan and Burgers(可持久化异或线性基+双指针)

    题意 给n个数,q组询问,每次询问l到r的最大异或和 思路来源 某cf奆神代码 题解 本来应该是线性基上分治的 这里一发基数+贪心也能过 真是神仙代码啊 双指针的经典应用: 对于每个询问[l,r],r ...

  6. 1728 problem B

    B. Best Permutation 文章目录 B. Best Permutation 题意 题解 题意 Let's define the value of the permutation pp o ...

  7. 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 ...

  8. cf 1512 E. Permutation by Sum

    cf 1512 E. Permutation by Sum 题意: 我们定义排列的概念为:从1到n的整数组成的序列,每个数字只出现一次 现在给你n,l,r,s,让你构造一个长度为n的排列,使得其中的第 ...

  9. 【cf】Codeforces 题解等汇总

    [cf]Codeforces Round #774 (Div. 2) 前4题 [cf]Codeforces Round #774 (Div. 2) 前4题_legend_yst的博客-CSDN博客 [ ...

最新文章

  1. 阿里巴巴为什么不建议直接使用Async注解?
  2. java 文件夹删除_java创建删除文件及文件夹大全
  3. jmeter正则表达式提取器多模块相互调用
  4. 多所高校通知,新学期延期开学!做好线上教学准备
  5. 数据科学入门与实战:玩转pandas之一
  6. Java 11 中 11 个不为人知的瑰宝
  7. 独家 | 一文读懂语音识别(附学习资源)
  8. PMP考试今年改革吗?
  9. Linux—RAID磁盘阵列与阵列卡
  10. _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringB5cxx11Ev
  11. 全天下最经典的句子,2013重现!
  12. 红颜弹指老,刹那芳华(转载 作者:程灵素)
  13. wordpress mysql 密码重置_WordPress登录密码找回办法之修改数据库篇 | Wopus
  14. 【产品笔记】2.互联网产品修炼
  15. 南方科技大学计算机系图灵班,【独家】上了大学就自由了,老师管得少! 这所高校:喔?是吗?...
  16. 花式栈溢出技巧之frame faking
  17. Variable Generator/dense/kernel already exists, disallowed.
  18. windows下的300个免费软件
  19. 使用scrapy框架抓取手机商品信息(2)
  20. 戴森球计划 超级计算机,戴森球计划steam版

热门文章

  1. stm32f103 GPIO—— 一灯大师之库函数版
  2. deconv layer
  3. Java通过JDBC连接MySQL
  4. 学网络工程师好吗?有钱途不?
  5. win7和win8.1关闭superfetch主动读盘占用
  6. 不要迷恋哥,哥只是个传说(华为版)
  7. 恶魔奶爸的英语学习笔记
  8. 被骂了十年的国产软件,却成了世界之最...没想到架构这么牛
  9. pandas创始人手把手教你利用Python进行数据分析!
  10. 【文件上传】软链接+zip包上传