题目大意
给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;
}