zoukankan      html  css  js  c++  java
  • Codeforces Round #573 (Div. 2) D题题解

    一.题目

    ​ Tokitsukaze, CSL and Stone Game

    ​ Tokitsukaze和CSL正在玩一些石头游戏。

    ​ 一开始,有n堆的石头,第i堆石头数记为 (a_i),两人轮流操作。 Tokitsukaze先行动。 在每个回合中,玩家选择非空的一堆石头并从中移除一块石头。 如果在操作前每堆都是空的,或者如果在移除石头之后,有两堆(可能是空的)包含相同数量的石头,则该玩家输了。 假设两位球员都采取最优方案,谁将赢得比赛?

    ​ 考虑一个例子: n = 3,(a_1)=2, (a_2)=3, (a_3)=0.选择空堆是不可能的,因此Tokitsukaze有两种选择:从第一堆和第二堆中拿走一块石头。当他从第一堆拿石头后,(a_1)=1, (a_2)=3, (a_3)=0,这是可行的;当他从第二堆拿石头后,(a_1)=2, (a_2)=2, (a_3)=0,他会立即输掉。因此他只能从第一堆拿石头。

    ​ 假设两人总是采取最佳方案并且永远不会犯错误,谁将赢得比赛?

    ​ 请注意,即使最初有两堆的石头数目相同,Tokitsukaze仍然可以进行有效的第一步,只需要在拿走石头后没有两堆的石头数目相同即可。

    输入

    ​ 第一行包含一个整数 n ((1 ≤ n ≤ 10^5))代表石堆数

    ​ 第二行包含 n个 整数 (a_1,a_2,...,a_n(0≤a_i≤10^9))

    输出

    ​ 如果Tokitsukaze赢,打印(“sjfnb”);如果CSL赢,打印(“cslnb”);请注意,输出字符区分大小写,且没有引号

    Examples

    input

    1
    0
    

    output

    cslnb
    

    input

    2
    1 0
    

    output

    cslnb
    

    input

    2
    2 2
    

    output

    sjfnb
    

    input

    3
    2 3 1
    

    output

    sjfnb
    

    注意

    在第一个例子中,Tokitsukaze不能拿任何石头,所以CSL将获胜。

    在第二个例子中,Tokitsukaze只能从第一堆中获取一块石头,然后,即使它们没有石头,这两堆也将拥有相同数量的石头,这意味着CSL将获胜。

    在第三个例子中,Tokitsukaze将获胜。 :

    • 首先,Tokitsukaze可以选择第一堆并从那堆中取出一块石头。
    • 然后,CSL只能选择第一堆,因为如果他选择第二堆,他将立即失去。
    • 最后,Tokitsukaze可以选择第二堆,然后CSL将别无选择,只能输。

    在第四个例子中,他们在任何时候都只有一个不错的选择,因此Tokitsukaze可以让游戏持续尽可能长的时间并最终获胜。

    二.解题思路

    首先用数组a来依次存入(a_i);

    我们可以定义石头数量相同的两堆为一个“pair”。我们来考虑三种情况:

    1. 当初始状态中有两个pair时,那么无论第一个人破坏哪一个pair,都会有两堆的石头数相同,他必输。

    2. 当初始状态中没有pair(即不存在有相同数量的两堆石头):

      ​ 我们先对数组(a)进行升序排序。可以发现:

      ​ a.在每人拿走一块石头后,一定有(a[i]>a[i-1])

      ​ b.数组a从0开始存的情况下,一定有第i堆石头数(a[i-1]>=i-1).因为第一堆最少为0块,第二堆至少比第一堆多1,即第二堆最少有一块,递推得第(i)堆最少有(i-1)块石头。

      ​ c.当(a[0]=0,a[1]=1,...,a[n-1]=n-1)时,下一个人已经无路可走,我们可以称该状态为必输状态

      ​ d.在pair=0的情况下,任何初始状态都会演变成必输状态

      ​ 因此,当前状态变成必输状态若经过了奇数次操作(即拿走了奇数块石头),第一个人Tokitsukaze赢;而经过了偶数次操作,第二个人CSL赢。

      3.当初始状态中仅有一个pair(即仅存在两堆有相同数量的石头),情况和pair=0类似,对数组a升序排序后任然满足a-c三条规律,不过会出现第一个人连第一步都无法进行的初始状态:

      ​ 记第index堆和第index+1堆有相同的石头数,则a[index]=a[index+1],当a[index-1]=a[index]-1时,当前状态也是一种必输状态,因此需要特判一下,在破坏唯一的pair时,会不会又出现两堆有相同的石头数量。

    三.AC代码

    #include<bits/stdc++.h>
    using namespace std;
    int a[100005];
    typedef long long LL;
    
    int main(){
    	int n,num=0,index;
    	LL sum=0,aim=0;
    	cin>>n;
    	aim=(LL)n*(LL)(n-1)/2;
    	for(int i=0;i<n;i++) 	cin>>a[i];
    	sort(a,a+n);
    	for(int i=0;i<n-1;i++){
    		if(a[i]==a[i+1]){
    			num++;index=i;
    		}
    	}
    	if(num>=2)	{cout<<"cslnb";return 0;}
    	if(num==0){
    		for(int i=0;i<n;i++) sum+=(LL)a[i];
    		if((sum-aim)%2) {cout<<"sjfnb";return 0;}
    		else {cout<<"cslnb";return 0;}
    	}
    	else{
    		if(a[index]==0) {cout<<"cslnb";return 0;}
    		if(index==0||a[index-1]!=a[index]-1){
    			for(int i=0;i<n;i++) sum+=(LL)a[i];
    			if((sum-aim)%2) {cout<<"sjfnb";return 0;}
    			else {cout<<"cslnb";return 0;}
    		}
    		else cout<<"cslnb";
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    利用calc()宽度计算做响应式布局
    设置背景图片后,使用backgroup-size出现的问题
    三、算法与控制结构
    C++数值计算
    python认识及环境变量
    Unity查找Editor下Project视图中特定的资源
    UGUI ScrollRect滑动居中CenterOnChild实现
    unity与android交互总结
    UGUI笔记
    UGUI性能优化
  • 原文地址:https://www.cnblogs.com/notorious/p/11181890.html
Copyright © 2011-2022 走看看