https://codeforces.com/contest/1772/problem/E

题目大意就是给一个1~n的全排序列,所有数字都是红色的,两人轮流操作,操作有三种选择,第一是将所有蓝色的数字任意排列,第二是将其中一个红色数字变蓝,第三是什么都不操作,该游戏有三种情况1胜,2胜和平局,如果最后序列为1~n的排列形式1胜,如果为n~1的排列形式则2胜利

思路:由上面我们发现,如果出现一种情况就是还剩一个就全变蓝了,则是平局,我们可以比较1~n的全排和n~1的全排和原来的序列,得到两个人赢分别需要变蓝多少个,注意这里要区分两个人都要的需要变蓝的元素

代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=5e5+10;
long long p[N];
int n;
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
int sum1=0,sum2=0;//统计各自需要变蓝的元素个数,不包括同时需要的
int sum=0;//统计两个人同时需要的
for(int i=1;i<=n;i++){
cin>>p[i];
if(p[i]==n-i+1&&p[i]!=i) sum1++;
if(p[i]==i&&p[i]!=n-i+1) sum2++;
if(p[i]!=i&&p[i]!=n-i+1) sum++;
}
while(sum1+sum>0||sum2+sum>0){//我们发现,如果想要赢,优先选只有自己需要的元素,再选两人都需要的元素
if(sum1>0) sum1--;
else sum--;
if(sum1+sum<=0) break;
if(sum2>0) sum2--;
else sum--;
if(sum2+sum<=0) break;
}
if(sum1+sum==0&&sum2>0) cout<<"First"<<endl;//如果第一个所需要变蓝的元素全部选完但第二个人需要的还没选完
else if(sum2+sum==0&&sum1>0) cout<<"Second"<<endl;//第二个同上
else cout<<"Tie"<<endl;//如果没人多余的话,说明其中最后一个是两人都需要选的,则谁先选谁就输,因此两人都会跳过形成死循环
}
}

最新文章

  1. 编程:递归编程解决汉诺塔问题(用java实现)
  2. POJ 2352 Stars 线段树 数星星
  3. 【Alpha版本】 第七天 11.15
  4. OpenGL教程
  5. Laravel之Service Container服务容器
  6. Elasticsearch template configuration
  7. Eclipse对printf()不能输出到控制台的解决方法
  8. 关于 jquery.showLoading 中 出现的 图标不在页面中间的问题
  9. SQLite3简单入门及C++ API
  10. Swift - iOS应用的国际化与本地化
  11. Linux IP代理筛选系统(shell+proxy)
  12. The Accomodation of Students(判断二分图以及求二分图最大匹配)
  13. hdu1011 Starship Troopers 树形DP
  14. 将后面的m个数移到前面
  15. js数据结构与算法——字典与散列表
  16. html-字体属性
  17. win32 窗口缩放时出现闪屏
  18. C# Message类的属性Msg所关联的消息ID
  19. js &amp; 快捷键 &amp; vue bind bug
  20. Python图形界面Tk

热门文章

  1. EF中使用SqlBulkCopy
  2. SSL certificate problem: unable to get local issuer certificate 错误解决
  3. [iOS] 随手记录 IDFA 的一些相关内容
  4. Java集合-Set接口
  5. C语言的qsort函数
  6. python脚本打包
  7. 剑指 Offer II 二分查找
  8. 【Word】通配符和特殊字符
  9. pyinstaller根据虚拟环境virtualenv进行打包,降低exe文件大小
  10. GDAL 安装