[AGC002E]Candy Piles

题意:

有$N$堆糖,两个人轮流拿糖,可以从每堆糖里拿$1$颗糖或拿走最多的一堆,拿到最后一颗糖的人输,问是否先手必胜

 

首先把问题转化一下,以$(7,6,6,6,4,4,4,2)$为例

假设左下角的点及其右上图形构成当前状态,答案就是$(1,1)$的胜负状态

在所有糖果堆中吃一颗$\Rightarrow$把最下一列删掉$\Rightarrow$点往上移$1$单位

吃掉糖果数最多的糖果堆$\Rightarrow$把最左一列删掉$\Rightarrow$点往右移$1$单位

观察对角线上的位置$(x,x)$

若$(x,x)$先手必败,则$(x-1,x)$和$(x,x-1)$都先手必胜,则$(x-1,x-1)$先手必败

若$(x,x)$先手必胜,则$(x-1,x)$和$(x,x-1)$中有先手必败,则$(x-1,x-1)$先手必胜

所以一旦确定对角线最远端的状态,整条对角线的状态都确定了,而且是一样的

对角线最远端的状态就容易确定了,从最上和最右一路推过来即可

yes!

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100010],n,i,j,up,right;
bool cmp(int a,int b){return a>b;}
int main(){
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",a+i);
	sort(a+1,a+n+1,cmp);
	for(i=1;i<=n;i++){
		if(a[i]>=i&&a[i+1]<=i)break;
	}
	up=((a[i]-i)&1)^1;
	for(j=i;a[j]==i;j++);
	j--;
	right=((j-i)&1)^1;
	puts((up&right)?"Second":"First");
}

转载于:https://www.cnblogs.com/jefflyy/p/7704943.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值