zoukankan      html  css  js  c++  java
  • Codeforces #658 Problem B

    题面

    There are n piles of stones, where the i-th pile has ai stones. Two people play a game, where they take alternating turns removing stones.

    In a move, a player may remove a positive number of stones from the first non-empty pile (the pile with the minimal index, that has at least one stone). The first player who cannot make a move (because all piles are empty) loses the game. If both players play optimally, determine the winner of the game.

    Input
    The first line contains a single integer t (1≤t≤1000) — the number of test cases. Next 2t lines contain descriptions of test cases.

    The first line of each test case contains a single integer n (1≤n≤105) — the number of piles.

    The second line of each test case contains n integers a1,…,an (1≤ai≤109) — ai is equal to the number of stones in the i-th pile.

    It is guaranteed that the sum of n for all test cases does not exceed 105.

    Output
    For each test case, if the player who makes the first move will win, output "First". Otherwise, output "Second".

    Example
    inputCopy
    7
    3
    2 5 4
    8
    1 1 1 1 1 1 1 1
    6
    1 2 3 4 5 6
    6
    1 1 2 1 2 2
    1
    1000000000
    5
    1 2 2 1 1
    3
    1 1 1
    outputCopy
    First
    Second
    Second
    First
    First
    Second
    First

    思路

    就是一个按顺序的尼姆博弈。但和原策略完全不一样。首先我们是可以把一堆石子全部拿完的,所以先手的策略是最好是最后一堆的选择权在我的手上,这样我直接拿光就赢了,后手也是一样,模拟几组情况你会发现,最终我们要判断的就是这个决定权掌握在谁手上。

    代码实现

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    const int maxn=101000;
    
    int a[maxn];
    
    int main () {
       int  t;
       cin>>t;
       while (t--) {
          int n;
          cin>>n;
          for (int i=0;i<n;i++) cin>>a[i];
          int cnt=0;
          if (n==1) {
              cout<<"First"<<endl;
              continue;
          }
          else {
              while (a[cnt]==1&&cnt<n) cnt++;
              
              if (cnt==n) {
                  if (cnt%2==0) cout<<"Second"<<endl;
                  else cout<<"First"<<endl;
              }
              else {
                  if (cnt%2==0) cout<<"First"<<endl;
                  else cout<<"Second"<<endl;
              }
              
          }
    
       }       
    
        return 0;
    }
    
  • 相关阅读:
    Laravel5.0学习--01 入门
    MySQL账户安全设置
    360路由器c301最新固件支持万能中继
    PsySH:PHP交互运行环境
    PHP-CS-Fixer:格式化你的PHP代码
    JVM 类加载机制详解
    Java虚拟机(JVM)概述
    聊一聊 Spring 中的线程安全性
    Java 里如何实现线程间通信
    Java 数据结构
  • 原文地址:https://www.cnblogs.com/hhlya/p/13360237.html
Copyright © 2011-2022 走看看