zoukankan      html  css  js  c++  java
  • P1247 取火柴游戏 (奇异局势)

    题目链接

    题目描述

    输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取。

    谁取走最后一根火柴为胜利者。

    编一个程序,在给出初始状态之后,判断是先取必胜还是先取必败,如果是先取必胜,请输出第一次该如何取。如果是先取必败,则输出“lose”。

    输入格式

    第一行,一个正整数k

    第二行,k个整数n1,n2,…,nk

    输出格式

    如果是先取必胜,请在第一行输出两个整数a,b,表示第一次从第b堆取出a个。第二行为第一次取火柴后的状态。如果有多种答案,则输出<b,a>字典序最小的答案(即b最小的前提下a最小)。

    如果是先取必败,则输出“lose”。

    题解:copy from : https://www.luogu.com.cn/blog/user53167/solution-p1247

     1 #include <bits/stdc++.h>
     2 # define LL long long
     3 using namespace std;
     4 
     5 int k;
     6 int arr[500010];
     7 int main(){
     8     scanf("%d", &k);
     9     int check=0;
    10     for(int i=1;i<=k;++i){
    11         scanf("%d", arr+i);
    12         check^=arr[i];
    13     }
    14     if(check==0){
    15         printf("lose");
    16         return 0;
    17     }
    18 
    19     for(int i=1;i<=k;++i){
    20         if((check^arr[i])<arr[i]){
    21             int move=arr[i]-(check^arr[i]);
    22             arr[i]=check^arr[i];
    23             printf("%d %d
    ",move,i);
    24             break;
    25         }
    26     }
    27     for(int i=1;i<=k;++i){
    28         printf("%d ", arr[i]);
    29     }
    30     return 0;
    31 }

     

  • 相关阅读:
    四则运算题目生成器
    个人博客作业Week1
    M1/M2项目阶段总结
    个人博客作业week7
    个人博客作业—2
    第一周个人博客作业
    关于生成四则运算式
    个人博客作业week7
    第二次博客作业
    关于webservice大数据量传输时的压缩和解压缩
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12256503.html
Copyright © 2011-2022 走看看