Codeforces Round #706 (Div. 2) D. Let‘s Go Hiking

本文探讨了一个涉及策略选择的游戏问题,通过寻找最长单调序列来决定玩家Qingshan能否战胜对手Daniel。文章详细分析了不同序列组合下Qingshan的获胜可能性,并提供了一段C++代码实现解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

题目大意

给n个不同的整数,刚开始,Qingshan 可以选一个数a, Daniel 可以选择一个数b,之后Qingshan 先走,Qingshan 可以选择移动到在数组中与数字a相邻的且小于a的数,Daniel 可以选择移动到在数组中与数字b相邻的且大于b的数,并且a和b不能相等,问可以让Qingshan获胜的a的个数,获胜条件为此时该Daniel 走,且Daniel 无处可走

题解

我们可以找最长的单调序列,因为显然单调序列越长,可以走的步数越多,获胜的可能越大。
如果最长的单调序列数量有3个或3个以上,那么 Qingshan 必输,因为Daniel 完全可以选择一个和Qingshan 不同的单调序列,由于Qingshan 先走,最后一定是Qingshan 先走到尽头。
如果最长的单调序列只有1个,不如将其命名为s,那么Qingshan 必然要选择s里最大的值a,如果s为奇数个,Daniel 可以选择s中的次小值b,这样如果Qingshan 向b的方向走,最终Qingshan 会和Daniel 相遇,且此时该Qingshan 移动了,Qingshan 输,如果Qingshan 向背离b的方向走,Qingshan 最多走s-2次,因为最长的单调序列长度为s且只有一个,而Daniel 也能走s-2次,因为s中还有s-2个比b大的数,此中情况也是Qingshan 输,如果s为偶数个,那么同理Daniel 选择s中的最小值,Qingshan 必输
如果最长的单调序列有2个,且并不相连,形成如\ \样子的两个递减序列,或形成如/ /样子的两个递增序列,那显然Qingshan 会输,和最长单调序列有3个的情况一样,如果形成如V的山谷形单调序列,那么Daniel 的选择更多,而且由于Daniel 后手,所以Qingshan 必输,如果形成/\的山形单调序列,如果每个序列长度为偶数,那么Qingshan 还是必输,大家可以走一下试试,只有序列长度为奇数时,Qingshan 才会胜利
所以得出了结论,只有形如/\的两个相连的单调序列,如1 2 5 4 3,才能让Qingshan 胜利

#include<cstdio>
const int MAX=1e5+5;
int p[MAX];
int main(){
	int n,num=0,l=0,lnow=1,lr=1;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&p[i]);
	}
    n--;
	while(n){
		lnow=1;
		while(n&&p[n]>p[n-1]){
			lnow++;
			n--;
		}
		if(lnow==l){
			num++;
		}else if(lnow>l){
			lr=0;
			num=1;
			l=lnow;
		}
		lnow=1;
		while(n&&p[n]<p[n-1]){
			lnow++;
			n--;
		}
		if(lnow==l){
			num++;
		}else if(lnow>l){
			lr=1;
			num=1;
			l=lnow;
		}
	}
	if(num==2&&l&1&&lr){
		printf("1\n");
	}else{
		printf("0\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值