2463: [中山市选2009]谁能赢呢?&& Codeforces Round #429 (Div. 2) B. Godsend && noip三国游戏

Description

 
小明和小红经常玩一个博弈游戏。给定一个n×n的棋盘,一个石头被放在棋盘的左上角。他们轮流移动石头。每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过。谁不能移动石头了就算输。假如小明先移动石头,而且两个选手都以最优策略走步,问最后谁能赢?
 

Input

    输入文件有多组数据。
    输入第一行包含一个整数n,表示棋盘的规模。
    当输入n为0时,表示输入结束。
 

 

Output

对于每组数据,如果小明最后能赢,则输出”Alice”, 否则输出”Bob”, 每一组答案独占一行。

Sample Input

2
0

Sample Output

Alice

HINT

 

对于所有的数据,保证1<=n<=10000。
---------------------------------
解:

n为偶时棋盘一定可以被若干个1*2的骨牌覆盖

先手每次都是从一块骨牌的一端走向另一端

后手总是走向另一块骨牌,所以先手必胜

n为奇时先手走完一步后又能被若干个1*2的骨牌覆盖了

所以先后手互相转变,后手必胜。

借鉴Brian551:

http://blog.csdn.net/Brian551/article/details/78065367

#include<cstdio>
int main()
{
    int n;
    while(true)
    {
        scanf("%d",&n);
        if(!n) break;
        if(n%2==0)    printf("Alice\n");
        else printf("Bob\n");
        
    }
    return 0;
}
View Code

嘻嘻,学学简单的博弈论(no use sg);

 
 
===============
B. Godsend
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Leha somehow found an array consisting of n integers. Looking at it, he came up with a task. Two players play the game on the array. Players move one by one. The first player can choose for his move a subsegment of non-zero length with an odd sum of numbers and remove it from the array, after that the remaining parts are glued together into one array and the game continues. The second player can choose a subsegment of non-zero length with an even sum and remove it. Loses the one who can not make a move. Who will win if both play optimally?

Input

First line of input data contains single integer n (1 ≤ n ≤ 106) — length of the array.

Next line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).

Output

Output answer in single line. "First", if first player wins, and "Second" otherwise (without quotes).

Examples
input
4
1 3 2 3
output
First
input
2
2 2
output
Second
Note

In first sample first player remove whole array in one move and win.

In second sample first player can't make a move and lose.

answer :一个人取奇数,另一个人取偶数

 判断奇偶;

借鉴Brian551(too);

#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    int flag=0;
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(!flag&&x%2==1) flag=1;
    }
    if(flag) printf("First\n");
    else printf("Second\n");
    return 0;
}
View Code

 

 

==============

 

三国游戏

 

描述

小涵很喜欢电脑游戏,这些天他正在玩一个叫做《三国》的游戏。 
在游戏中,小涵和计算机各执一方,组建各自的军队进行对战。游戏中共有N 位武将(N为偶数且不小于4),任意两个武将之间有一个“默契值”,表示若此两位武将作为一对组合作战时,该组合的威力有多大。游戏开始前,所有武将都是自由的(称为自由武将,一旦某个自由武将被选中作为某方军队的一员,那么他就不再是自由武将了),换句话说,所谓的自由武将不属于任何一方。游戏开始,小涵和计算机要从自由武将中挑选武将组成自己的军队,规则如下:小涵先从自由武将中选出一个加入自己的军队,然后计算机也从自由武将中选出一个加入计算机方的军队。接下来一直按照“小涵→计算机→小涵→„„”的顺序选择武将,直到所有的武将被双方均分完。然后,程序自动从双方军队中各挑出一对默契值最高的武将组合代表自己的军队进行二对二比武,拥有更高默契值的一对武将组合获胜,表示两军交战,拥有获胜武将组合的一方获胜。

已知计算机一方选择武将的原则是尽量破坏对手下一步将形成的最强组合,它采取的具体策略如下:任何时刻,轮到计算机挑选时,它会尝试将对手军队中的每个武将与当前每个自由武将进行一一配对,找出所有配对中默契值最高的那对武将组合,并将该组合中的自由武将选入自己的军队。

下面举例说明计算机的选将策略,例如,游戏中一共有6 个武将,他们相互之间的默契值如下表所示
img
双方选将过程如下所示:
img
小涵想知道,如果计算机在一局游戏中始终坚持上面这个策略,那么自己有没有可能必胜?如果有,在所有可能的胜利结局中,自己那对用于比武的武将组合的默契值最大是多少? 假设整个游戏过程中,对战双方任何时候均能看到自由武将队中的武将和对方军队的武将。为了简化问题,保证对于不同的武将组合,其默契值均不相同。

格式

输入格式

共N 行。

第一行为一个偶数N(N≤ 500),表示武将的个数。

第2 行到第N 行里,第(i+1)行有(N−i)个非负整数,每两个数之间用一个空格隔开,表示i 号武将和i+1,i+2,„„,N 号武将之间的默契值(0 ≤ 默契值≤ 1,000,000,000)。

输出格式

共1 或2 行。

若对于给定的游戏输入,存在可以让小涵获胜的选将顺序,则输出1,并另起一行输出。
所有获胜的情况中,小涵最终选出的武将组合的最大默契值。 
如果不存在可以让小涵获胜的选将顺序,则输出0。

样例1

样例输入1

6  
5 28 16 29 27 
23 3 20 1 
8 32 26 
33 11 
12

样例输出1

1
32

样例2

样例输入2

8  
42 24 10 29 27 12 58 
31 8 16 26 80 6 
25 3 36 11 5 
33 20 17 13 
15 77 9 
4 50 
19

样例输出2

1
77

限制

每个测试点1s。

提示

样例1说明:
首先小涵拿走5 号武将;计算机发现5 号武将和剩下武将中的4 号默契值最高,于是拿走4 号;小涵接着拿走3 号;计算机发现3、5 号武将之一和剩下的武将配对的所有组合中,5 号和1 号默契值最高,于是拿走1 号;小涵接着拿走2 号;计算机最后拿走6 号。在小涵手里的2,3,5 号武将中,3 号和5 号配合最好,默契值为32,而计算机能推出的最好组合为1 号和6 号,默契值为27。结果为小涵胜,并且这个组合是小涵用尽所有方法能取到的最好组合。

来源

NOIP2010普及组

answer:

选每个武将的第二大;

必胜,so print "1\n%d";

#include<cstdio>
#include<cstring>
int map[510][510];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            scanf("%d",&map[i][j]),map[j][i]=map[i][j];
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int maxx=0,maxx2=0;
        for(int j=1;j<=n;j++)
        {
            if(map[i][j]>maxx) maxx2=maxx,maxx=map[i][j];
            else if(maxx2<map[i][j]) maxx2=map[i][j];
        }
        if(maxx2>ans) ans=maxx2;
    }    
    printf("1\n%d\n",ans);
    return 0;
}
View Code

=============

water:

1.vijos 1281 Easy Selection

 

---END-----

posted @ 2017-09-25 21:18  12fs  阅读(156)  评论(0编辑  收藏  举报