Codeforces Round 839 (Div. 3)E题解

文章目录

Permutation Game

问题建模

给定一个长度为n的排列,排列的每个元素都被阻塞无法移动,有两个玩家,每个玩家每一轮可以选择三种操作的一种执行,操作1为重新排序所有未被阻塞的元素,操作2为将序列中的一个元素解除阻塞,操作3为跳过,若玩家1能先将所有元素排为升序则其胜利,若玩家2能将所有元素排为降序则其胜利,否则平局。

问题分析

1.分析一个玩家想要获胜的关键

一个玩家想要获胜则需要在其想要获得顺序的元素中那些不符合他所需顺序的元素都解除阻塞后,第一个执行重新排序的操作将所有元素排成所需的才可以。而另一个玩家想要获胜也同样如此。因此获胜关键在阻塞元素上。

2.分析阻塞元素的类别

两个玩家都需要解除阻塞不符合他们所需顺序的元素,而这些元素中有一部分位置是一样的,为了让自己获胜,则优先做对自己最有利的事,即先解封不一样的。设玩家1独立所需解封元素数量为a,玩家2独立所需解封元素数量为b,共同所需解封元素数量为c。

3.分析阻塞元素的类别对于局面的影响

当玩家1想要获胜时需要将其所有需要解除阻塞的元素都解除,且需要赶在另一个玩家解除其单独所需元素之前执行完,则需满足的条件为a+c<=b,取等于是因为玩家1先手的话,当所有所需元素都解封了,能先手执行排序操作,若满足小于的话则必定能在玩家2解除其单独所需元素之前,将自己所需元素都解除,且先执行排序操作。

则当玩家2想要获胜时则需要满足的条件为b+c<a,若满足该条件必定能在玩家1解除其所需元素之前,将自己所需元素都解除,且先执行排序操作。

其余情况,则为任意一个玩家都不能赶在另一个玩家解除其单独所需元素之前先将所需元素都解除阻塞,那另一个玩家在解除其单独所需元素后,可以一直执行操作3,等待所有元素解封后执行排序操作,则最终进入两个玩家都不解除最终所需的元素,从而平局。

代码

c 复制代码
#include<bits/stdc++.h>

#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N = 5e5 + 10, INF = 0x3f3f3f3f;

void solve() {
    int n;
    cin >> n;
    int a = 0, b = 0, c = 0;
    for (int i = 0; i < n; i++) {
        int x;
        scanf("%d", &x);
        if (x != i + 1) {
            if (x != n - i)  c++;
            else a++;
        } else b++;
    }

    if(a+c<=b)  puts("First");
    else if(b+c<a)  puts("Second");
    else puts("Tie");
}

int main() {
    int t = 1;
    cin >> t;
    while (t--) solve();
    return 0;
}
相关推荐
你撅嘴真丑3 小时前
第九章-数字三角形
算法
uesowys3 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder3 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮3 小时前
AI 视觉连载1:像素
算法
智驱力人工智能4 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥5 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风5 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風5 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT065 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠6 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法