zoukankan      html  css  js  c++  java
  • P3480 [POI2009]KAM-Pebbles 阶梯NIM

    $ color{#0066ff}{ 题目描述 }$

    有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。

    (color{#0066ff}{输入格式})

    多组输入,第一行一个整数u代表数据组数(1<=u<=10)

    接下来共2*u行,每两行代表一组数据:

    第一行只有一个整数n(1<=n<=1000),表示石子堆数;

    第二行有n个整数用空格隔开,第i个整数ai表示第i堆的石子个数,保证a1<=a2<=a3...<=an。

    对于每组数据,保证石子总数不超过10000。

    (color{#0066ff}{输出格式})

    输出u行,如果第i组数据先手必胜,输出“TAK”,否则输出“NIE”。

    (color{#0066ff}{输入样例})

    2
    2
    2 2
    3
    1 2 4
    

    (color{#0066ff}{输出样例})

    NIE
    TAK
    

    (color{#0066ff}{数据范围与提示})

    none

    (color{#0066ff}{题解})

    考虑每一堆石子能拿多少,就是(a[i]-a[i-1]),差分数组

    如果在i堆拿了x个石子,那么相当于i堆可拿石子数-x,i+1堆可拿石子数+x

    也就是说从i堆向i+1堆拿了x个石子,这是反着的阶梯NIM!!!

    #include<bits/stdc++.h>
    #define LL long long
    LL in() {
    	char ch; LL x = 0, f = 1;
    	while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
    	for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
    	return x * f;
    }
    int a[1005050];
    int main() {
    	for(int T = in(); T --> 0;) {
    		int n = in();
    		int ans = 0;
    		for(int i = 1; i <= n; i++) a[i] = in();
    		for(int i = n; i >= 1; i--) a[i] -= a[i - 1];
            //注意要反着求
    		for(int i = n; i >= 1; i -= 2) ans ^= a[i];
    		printf(ans? "TAK
    " : "NIE
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    ABAP 没有地方输入H 进入DEBUG 怎么办?
    Jsoup实现java模拟登陆
    Jsoup模拟登陆例子
    Jsoup:解决java.net.UnknownHostException的问题
    Java抓取网页数据(原网页+Javascript返回数据)
    利用StringEscapeUtils对字符串进行各种转义与反转义(Java)
    MyEclipse + Tomcat 热部署问题
    管道寄售库存MRKO结算后,冲销问题
    c#操作appsettiongs
    让你的微信小程序具有在线支付功能
  • 原文地址:https://www.cnblogs.com/olinr/p/10482990.html
Copyright © 2011-2022 走看看