• 洛谷 P2148 [SDOI2009]E&D


    题目描述

    小E 与小W 进行一项名为“E&D”游戏。

    游戏的规则如下: 桌子上有2n 堆石子,编号为1..2n。其中,为了方便起见,我们将第2k-1 堆与第2k 堆 (1 ≤ k ≤ n)视为同一组。第i堆的石子个数用一个正整数Si表示。 一次分割操作指的是,从桌子上任取一堆石子,将其移走。然后分割它同一组的另一堆 石子,从中取出若干个石子放在被移走的位置,组成新的一堆。操作完成后,所有堆的石子 数必须保证大于0。显然,被分割的一堆的石子数至少要为2。 两个人轮流进行分割操作。如果轮到某人进行操作时,所有堆的石子数均为1,则此时 没有石子可以操作,判此人输掉比赛。

    小E 进行第一次分割。他想知道,是否存在某种策 略使得他一定能战胜小W。因此,他求助于小F,也就是你,请你告诉他是否存在必胜策略。 例如,假设初始时桌子上有4 堆石子,数量分别为1,2,3,1。小E可以选择移走第1堆, 然后将第2堆分割(只能分出1 个石子)。接下来,小W 只能选择移走第4 堆,然后将第3 堆分割为1 和2。最后轮到小E,他只能移走后两堆中数量为1 的一堆,将另一堆分割为1 和1。这样,轮到小W 时,所有堆的数量均为1,则他输掉了比赛。故小E 存在必胜策略。

    输入输出格式

    输入格式:

    第一行是一个正整数T(T ≤ 20),表示测试数据数量。接下来有T组 数据。 对于每组数据,第一行是一个正整数N,表示桌子上共有N堆石子。其中,输入数据保 证N是偶数。 第二行有N个正整数S1..SN,分别表示每一堆的石子数。

    输出格式:

    包含T 行。对于每组数据,如果小E 必胜,则输出一行”YES”,否则 输出”NO”。

    输入输出样例

    输入样例#1:
    2
    4
    1 2 3 1
    6
    1 1 1 1 1 1
    输出样例#1:
    YES
    NO
    【数据规模和约定】
    对于20%的数据,N = 2;
    对于另外20%的数据,N ≤ 4,Si ≤ 50;
    对于100%的数据,N ≤ 2×104,Si ≤ 2×109。

    一眼SG函数+打表找规律
    但这个规律真是日了狗了
    这道题充分说明了图形界面的优越性,我打了一堆a=1 b=1 sg=0这种东西出来,一点用都没有
    打个矩阵出来一看就知道了
     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <string>
     6 #include <cstring>
     7 #include <cmath>
     8 #include <map>
     9 #include <stack>
    10 #include <set>
    11 #include <vector>
    12 #include <queue>
    13 #include <time.h>
    14 #define eps 1e-7
    15 #define INF 0x3f3f3f3f
    16 #define MOD 1000000007
    17 #define rep0(j,n) for(int j=0;j<n;++j)
    18 #define rep1(j,n) for(int j=1;j<=n;++j)
    19 #define pb push_back
    20 #define set0(n) memset(n,0,sizeof(n))
    21 #define ll long long
    22 #define ull unsigned long long
    23 #define iter(i,v) for(edge *i=head[v];i;i=i->nxt)
    24 #define max(a,b) (a>b?a:b)
    25 #define min(a,b) (a<b?a:b)
    26 #define print_runtime printf("Running time:%.3lfs
    ",double(clock())/1000.0)
    27 #define TO(j) printf(#j": %d
    ",j);
    28 //#define OJ
    29 using namespace std;
    30 const int MAXINT = 100010;
    31 const int MAXNODE = 100010;
    32 const int MAXEDGE = 2*MAXNODE;
    33 char BUF,*buf;
    34 int read(){
    35     char c=getchar();int f=1,x=0;
    36     while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
    37     while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    38     return f*x;
    39 }
    40 char get_ch(){
    41     char c=getchar();
    42     while(!isalpha(c)) c=getchar();
    43     return c;
    44 }
    45 //------------------- Head Files ----------------------//
    46 int n;
    47 int getsg(int a,int b){
    48     ull tmp=2;
    49     for(int i=0;;i++,tmp*=2){
    50         if((a-1)%(tmp)<tmp/2&&(b-1)%(tmp)<tmp/2) return i;
    51     }
    52 }
    53 void get_input();
    54 void work();
    55 int main() {
    56     int T=read();
    57     
    58     while(T--){
    59         get_input();
    60         work();
    61     }
    62     return 0;
    63 }
    64 void work(){
    65     
    66 }
    67 void get_input(){
    68     n=read();
    69     int ans=0;
    70     rep0(i,n/2){
    71         int a=read(),b=read();
    72         ans^=getsg(a,b);
    73     }
    74     if(ans) printf("YES
    "); else printf("NO
    ");
    75 }
     
  • 相关阅读:
    梦想总是要有的,万一实现了呢?(转)
    registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. (转)
    Memory Leak(内存泄漏)问题总结(转)
    单元测试(UT)、功能测试(FT)(转)
    算法——动态规划篇——最长公共子序列
    设计模式总结
    C/C++基本数据类型所占字节数
    extjs tree check 级联选择
    骨骼动画具体解释
    java设计模式演示样例
  • 原文地址:https://www.cnblogs.com/LoveYayoi/p/6930739.html
Copyright © 2020-2023  润新知