codeforces-#666-D

codeforces-#666-D

八月 28, 2020

D. Stoned Game

题意

给出n堆石子

每堆石子有ai个石子

现在两个人轮流取某个非0的石堆中的1个石子

但是不能取上一轮对手取的那堆石子

谁不能再取出石子则输掉比赛

问谁赢

题解

是一个关于奇偶博弈和制高点的博弈

参考题解

若没有“不能取上一轮对手取的那堆石子”这个条件则

就是普通的奇偶博弈

但是加入这个条件后就形成了制高点 先手能强制占领优势局面不变

所以当(sum-max<max)时先手可以一直拿最大堆的石子 必胜

否则通过sum的奇偶性判断 若sum为奇数

先手一直从当前剩下最多且能拿的石子堆中拿 最后先手必胜

否则后手必胜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
#define Turnoff std::ios::sync_with_stdio(false)
const ll Max=1e5+5;
const double Pi=acos(-1);
const ll Mod=1e9;
/*

*/

ll data[Max];
int main() {
Turnoff;
ll n;cin>>n;
for(int i=0;i<n;i++)cin>>data[i];
if(n==1){
cout<<1<<" "<<1<<endl;
for(int i=0;i<n;i++)cout<<0<<" ";
}
else {
cout<<1<<" "<<n-1<<endl;
for(int i=0;i<n-1;i++)cout<<(n-1)*data[i]<<" ";
}
cout<<endl;
cout<<n<<" "<<n<<endl;
cout<<n-data[n-1]<<endl;
cout<<1<<" "<<n<<endl;
for(int i=0;i<n-1;i++)cout<<-n*data[i]<<" ";
cout<<-n<<endl;
//cout<<data[i]<<endl;

}