Codeforces_841_B Godsend(思路|简单博弈)

来源:互联网 发布:key转换ppt软件 编辑:程序博客网 时间:2024/05/22 00:54

Codeforces_841_B Godsend

题意

A和B两个人玩游戏
1. 在一个数组num[]中
2. A先从num[]数组中选择”任意的”“区间和是奇数”“连续的”一个区间,然后把这个区间的数字去掉.
3. 接下来是B从剩下的选择”任意的”“区间和是偶数”“连续的”一个区间,然后把这个区间的数字去掉
4. 直到谁没有数字可以去掉了,就输了

解决

  1. 第一次做cf有点小紧张,然后想了想就去判断奇数的个数和偶数的个数谁打谁小.结果被Hack掉了/(ㄒoㄒ)/~~
  2. 我们再想一想,其实,只要这个数组里出现了奇数,那就是A赢(输出first)

    1. 如果只有一个奇数, 2 2 1 2 2,第一个人会把所有的数字都拿掉,因为偶数不影响奇偶性
    2. 如果奇数是分散开的, 先看是奇数个数为奇数的情况: 2 1 2 1 2 1 4,第一个人还是会拿掉所有的…
    3. 如果是偶数个奇数,比如: 2 1 4 4 1 2 ,第一个人只要先拿掉2 1 4 4 给第二个人剩下一个奇数(第二个人不可能能拿奇数啊),这个奇数只能由第一个人来拿…所以还是第一个人赢…
  3. 所以这个题就变成了,判断有没有出现奇数就好了…

  4. 补充两个常见单词?^_^ odd num(偶数),even num(奇数)
#include <algorithm>#include <iostream>#include <cstring>#include <vector>#include <cstdio>#include <string>#include <cmath>#include <queue>#include <set>#include <map>#include <complex>using namespace std;typedef long long ll;typedef long double db;typedef pair<int,int> pii;typedef vector<int> vi;#define de(x) cout << #x << "=" << x << endl#define rep(i,a,b) for(int i=a;i<(b);++i)#define all(x) (x).begin(),(x).end()#define sz(x) (int)(x).size()#define mp make_pair#define pb push_back#define fi first#define se second#define E 1e-6#define INF 0x3f3f3f3fvoid open(){freopen("data.txt","r",stdin);}void out(){freopen("out.txt","w",stdout);}const int maxn = 101010;const int MOD = 1e9 + 7;int main(){    int x,n;    scanf("%d",&n);    rep(i,0,n){        scanf("%d",&x);        if(x&1){            puts("First");            return 0;        }    }    puts("Second");    return 0;}
原创粉丝点击