• JZ高中OJ 1308.取数游戏


    Description

      Alice想让Bob陪他去看《唐山大地震》,但由于Bob是个很感性的人,怕流泪不想去,但又不好意思以这个作为拒绝的理由,便提出玩一个游戏。
      N个正整数围成一圈,规则如下:
      •两个玩家轮流取数;
      •最开始先手的玩家可以取任意一个数x;
      •从第二步开始当前玩家只能取x(上一玩家刚刚取的数)左右两边相邻的数;
      •直到取完所有的数,游戏结束;
      •取得较多奇数的玩家获胜。
      Bob为了显示大度,让Alice先取,但他忘了自己和Alice都是绝顶聪明之人,现在Alice请你帮他计算第一步有多少种取法使得最终获得胜利。
     

    Input

      第一行包含一个整数N(1<=N<=100),表示数的个数。第二行包含N个正整数,每个数都在1到1000之间,任意两个数互不相同。

    Output

      输出Alice第一步有多少种取法。
     

    Sample Input

    输入1:
    3
    3 1 5
    
    输入2:
    4
    1 2 3 4
    
    输入3:
    8
    4 10 5 2 9 8 1 7
    

    Sample Output

    输出1:
    3
    
    输出2:
    2
    
    输出3:
    5
     1 #include<bits/stdc++.h>
     2 #define IL inline
     3 using namespace std;
     4 const int N=100;
     5 
     6     int n,a[N*2+3];
     7     int f[N*2+3][N*2+3];
     8     
     9 int main(){
    10     cin>>n;
    11     for(int i=1;i<=n;i++)
    12         cin>>a[i];
    13     
    14     for(int i=1;i<=n;i++)
    15         a[i]&=1;
    16     for(int i=1;i<=n;i++)
    17         a[i+n]=a[i];
    18     
    19     for(int i=1;i<=n*2;i++)
    20         f[i][i]=a[i];
    21     
    22     for(int t=2;t<=n;t++)
    23         for(int i=1;i+t-1<=n*2;i++){
    24             int j=i+t-1;
    25             f[i][j]=max(a[i]-f[i+1][j],a[j]-f[i][j-1]);
    26             
    27         }
    28         
    29     int ans=0;
    30     for(int i=1;i<=n;i++)
    31     if(a[i]-f[i+1][i+n-1]>0)
    32         ans++;
    33         
    34     cout<<ans;
    35     
    36     return 0;
    37     
    38 }
  • 相关阅读:
    感光板制作问答
    游戏外挂技术分析(转)
    div 显示和隐藏
    c# 构造sql语句
    Iframe自动适应高度
    .net web图表类
    通讯录从Database导出vCard格式
    winform通过HttpWebRequest(post方式)上传文件和传递参数
    c# CSV读入DataSet
    模拟器显示屏上方的信号和电池图标不显示设置
  • 原文地址:https://www.cnblogs.com/dsanying/p/11305391.html
Copyright © 2020-2023  润新知