至至子的鸿门宴「掘金日新计划 · 12 月更文挑战」

59 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

至至子的鸿门宴

链接:ac.nowcoder.com/acm/problem…
来源:牛客网

题目描述

至至子和苏苏子玩游戏。

给定一个序列 aaa,长度为 nnn,且满足 1≤a1<a2<⋯<an1\le a_1 < a_2 < \cdots < a_n1≤a1​<a2​<⋯<an​。

两人轮流对序列进行操作,至至子先手。每人每次选择一个 aia_iai​ 并让其减一,要求不破坏 1≤a1<a2<⋯<an1\le a_1 < a_2 < \cdots < a_n1≤a1​<a2​<⋯<an​ 的性质,无法操作者输。

假设至至子和苏苏子都绝顶聪明,那么请同样聪明绝顶的你告诉我,最后谁能赢。

输入描述:

第一行一个正整数 n,1≤n≤10_6。

第二行 n 个正整数,描述序列 a。满足 1≤a1<a2<⋯<an​ 且 an≤10_9。

输出描述:

输出只有一行一个字符串。若至至子必胜,则输出 ZZZ,若苏苏子必胜,则输出 SSZ。

示例1

输入

5
1 2 4 6 9

输出

ZZZ

说明

一种可能的情况是 (1,2,4,6,9)(1,2,4,6,9)(1,2,4,6,9) →\to→ (1,2,3,6,9)(1,2,3,6,9)(1,2,3,6,9) →\to→ (1,2,3,5,9)(1,2,3,5,9)(1,2,3,5,9) →\to→ (1,2,3,4,9)(1,2,3,4,9)(1,2,3,4,9) →\to→ (1,2,3,4,8)(1,2,3,4,8)(1,2,3,4,8) →\to→ (1,2,3,4,7)(1,2,3,4,7)(1,2,3,4,7) →\to→ (1,2,3,4,6)(1,2,3,4,6)(1,2,3,4,6) →\to→ (1,2,3,4,5)(1,2,3,4,5)(1,2,3,4,5),最后轮到苏苏子不能操作,所以至至子胜。

示例2

输入

3
1 2 3

输出

SSZ

说明

此时至至子一步都无法操作,所以苏苏子胜。

思路

这是一道简单博弈,因为不管怎么变都不能改变当前数组的特性,所以只要比较当前这个数减到他的位置的数的差,加起来,如果是偶数就是SSZ,否则就是ZZZ。(qwq很巧妙地一个题)

代码

#include<iostream>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
const int N=2E5+10;
int a[N];
signed main(){
    IOS;
    int n;
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i]-i;
    }
    if(sum&1)cout<<"ZZZ"<<endl;
    else cout<<"SSZ"<<endl;
    return 0;
}