首页 > ACM题库 > HDU-杭电 > hdu 2509 Be the Winner-博弈论-[解题报告]C++
2014
02-09

hdu 2509 Be the Winner-博弈论-[解题报告]C++

Be the Winner

问题描述 :

Let’s consider m apples divided into n groups. Each group contains no more than 100 apples, arranged in a line. You can take any number of consecutive apples at one time.
For example "@@@" can be turned into "@@" or "@" or "@ @"(two piles). two people get apples one after another and the one who takes the last is
the loser. Fra wants to know in which situations he can win by playing strategies (that is, no matter what action the rival takes, fra will win).

输入:

You will be given several cases. Each test case begins with a single number n (1 <= n <= 100), followed by a line with n numbers, the number of apples in each pile. There is a blank line between cases.

输出:

You will be given several cases. Each test case begins with a single number n (1 <= n <= 100), followed by a line with n numbers, the number of apples in each pile. There is a blank line between cases.

样例输入:

2
2 2
1
3

样例输出:

No
Yes

博弈论水题!!!

代码如下:

 

#include<stdio.h>
 #include<iostream>
 using namespace std;
 int main(){
     int i,t,n,k,m;
     while(cin>>n){
         m=0;t=0;
         for(i=0;i<n;i++){
             cin>>k;
             if(k>=2) t++;
             m^=k;
         }
         if((m==0&&t>=2)||(m!=0&&t==0)) cout<<"No"<<endl;
         else cout<<"Yes"<<endl;
     }
     return 0;
 }

 

 

解题转自:http://www.cnblogs.com/xin-hua/archive/2013/08/05/3239473.html


  1. 5.1处,反了;“上一个操作符的优先级比操作符ch的优先级大,或栈是空的就入栈。”如代码所述,应为“上一个操作符的优先级比操作符ch的优先级小,或栈是空的就入栈。”

  2. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。

  3. 在方法1里面:

    //遍历所有的边,计算入度
    for(int i=0; i<V; i++)
    {
    degree = 0;
    for (j = adj .begin(); j != adj .end(); ++j)
    {
    degree[*j]++;
    }
    }

    为什么每遍历一条链表,要首先将每个链表头的顶点的入度置为0呢?
    比如顶点5,若在顶点1、2、3、4的链表中出现过顶点5,那么要增加顶点5的入度,但是在遍历顶点5的链表时,又将顶点5的入度置为0了,那之前的从顶点1234到顶点5的边不是都没了吗?

  4. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。