现在的位置: 首页 > 综合 > 正文

poj1740

2018年01月15日 ⁄ 综合 ⁄ 共 707字 ⁄ 字号 评论关闭

【题意】

取石子游戏,有n堆石子(n<=10),每堆有stone[i]颗石子(<=100),A和B玩游戏,每次操作的人可以任选一堆石子拿出来起码一颗,然后可以选择把剩下的石子移到其他的非空石子堆中,给定局面问是否先手必胜

【输入】

多组数据

每组数据第一行一个n表示有多少堆石子

接下来一行n个数字表示每堆石子的数量

【输出】

对于每组数据,输出一个数字,1表示先手胜,0表示后手胜

博弈论

这个可以看出来,要是有两堆一样的那么先手无论如何操作后手只要做对称操作就可以胜利

三堆的时候只要将某一堆拿完使剩下两堆数量相同即可

多堆的时候

若n是奇数,只要将最大的一堆拿走,然后前面的偶数个两个一组将他们补齐即可

若n是偶数,将最大的一堆拿走,将所有的调整为两两相同即可,只有初始局面即是两两相等才无法调整

program poj1740;
var
  count,n,i,j,k:longint;
  have:array [0..101] of longint;
  stone:array [0..11] of longint;

begin
  repeat
    read(n);
    if n=0 then break;
    fillchar(have,sizeof(have),0);
    for i:=1 to n do
      begin
        read(stone[i]);
        inc(have[stone[i]]);
      end;
    if n and 1 = 1 then
      begin
        writeln(1);
        continue;
      end;
    count:=0;
    for i:=1 to n do
      if have[stone[i]] and 1 = 0 then inc(count);
    if count=n then writeln(0)
               else writeln(1);
  until false;
end.
【上篇】
【下篇】

抱歉!评论已关闭.