zoukankan      html  css  js  c++  java
  • Bzoj1228 [SDOI2009]E&D

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 855  Solved: 495
    [Submit][Status][Discuss]

    Description

    小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 存在必胜策略。

    Input

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

    Output

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

    Sample Input

    2
    4
    1 2 3 1
    6
    1 1 1 1 1 1

    Sample Output

    YES
    NO
    【数据规模和约定】
    对于20%的数据,N = 2;
    对于另外20%的数据,N ≤ 4,Si ≤ 50;
    对于100%的数据,N ≤ 2×10^4,Si ≤ 2×10^9。

    HINT

     

    Source

    提到ED满脑子都是……(突然住口)

    数学问题 博弈论 打表

    打表出奇迹。

    好像正解就是打表找规律。

    注释掉的那个程序就是打表程序。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<cmath>
     6 using namespace std;
     7 int read(){
     8     int x=0,f=1;char ch=getchar();
     9     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    10     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    11     return x*f;
    12 }
    13 /*
    14 int sg[36][36];
    15 int SG(int x,int y){
    16     if(sg[x][y]!=-1)return sg[x][y];
    17     bool vis[200];
    18     memset(vis,0,sizeof vis);
    19     for(int i=1;i<x;i++)vis[SG(x-i,i)]=1;
    20     for(int i=1;i<y;i++)vis[SG(i,y-i)]=1;
    21     for(int i=0;i<=100;i++)if(!vis[i]){
    22         sg[x][y]=i;return i;
    23     }
    24 }
    25 int main(){
    26     int i,j;
    27     memset(sg,-1,sizeof sg);
    28     sg[1][1]=0;sg[0][0]=sg[0][1]=sg[1][1]=0;
    29     sg[1][2]=sg[2][1]=sg[2][2]=1;
    30     for(int i=1;i<=35;i++){
    31         for(int j=1;j<=35;j++){
    32             printf("%d ",SG(i,j));
    33         }
    34         puts("");
    35     }
    36     return 0;
    37 }
    38 */
    39 int sg(int x,int y){
    40     if(x&y&1)return 0;
    41     unsigned long long i;int cnt;
    42     for(i=2,cnt=0;;i<<=1,cnt++){
    43         if((x%i<=i/2) && (y%i<=i/2) && (x%i) && (y%i))return cnt;
    44     }
    45 }
    46 int main(){
    47     int i,j;
    48     int T=read();
    49     while(T--){
    50         int n,x,y,res=0;
    51         scanf("%d",&n);
    52         n>>=1;
    53         for(i=1;i<=n;i++){
    54             scanf("%d%d",&x,&y);
    55             res^=sg(x,y);
    56         }
    57         if(res)printf("YES
    ");
    58         else printf("NO
    ");
    59     }
    60     return 0;
    61 }
     
  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6938328.html
Copyright © 2011-2022 走看看