hdu 4387 Stone Game

多校赛真的好难,,唔。。
只贡献了一道题。

试想,Alice有一颗棋子me,那么Bob的在me右边的棋子,与me相遇的时候,那么就是这样 OXX ,于是XONX,此时需要注意,这里要等到XOXN的时候才可以(要是变成XNOX的时候,此时会变成XXON,这样等于帮助了X棋子2次(跨过O棋),于是X占领左边的速度加快了,alice没那么脑残,只有当像上面那个例子左边只有一个棋子的时候,此时才可以,其他时候便帮助了敌方的大忙)于是我开始对这个此时感兴趣了,于是看
OOONNXXX
NOOONXXX O动
NOOOXNXX X动
NOONXOXX O动(由于中间X的帮助)
下面有趣的事开始了,无论X动哪一个都在帮O大忙, 于是Alice赢了
继续看
n*N ,k*O, X, 。。。(。。。表示不知道),只要O这块是致密的,X无论当出现这种情况时O先跳,那么Alice一定胜利。此时为了保持致密,那就每次跳左边那个好了

根据上面所说的(n-2*k)%2==0的时候,那么Alice一定赢了
当(n-2*k)%2==1&&k==1的时候Bob一定赢了。。
再举一个例子
ONX
NOX O跳 此时O在对称轴上
XON X跳 此时X(由于中间的O的帮助)。所以Bob胜利了

ONNX
NONX O跳
NOXN X跳
NNXO O跳,O(由于中间X的帮助),Alice胜利

ONNNX
NONXN O跳,然后X跳
NNOXN O跳
NXONN X跳
Bob胜利!
上面的就是这样

看其他情况 (n-2*k)%2==0
k!=1;
当n-2*k==1的时候Alice如果傻乎乎的还像上面这么挑绝对不可以(自己画画就好了),那该怎么办(还是这个例子)
OONXX这样的情况
NOOXX ONOXX O走
XOOXN XOONX OXONX OXOXN X走
XONXO XONOX OXNOX OXNXO O走,而且只能这么走
XOXNO XOXON OXXON OXXNO X走,而且只能这么走
XNXOO XNXOO NXXOO NXXOO O走,而且只能这么走(从左向右A,B,C,D)
发现最后无论如何ALice都是胜利了。。
因为Alice先走,alice先走出最左边的棋子,这样Alice每走一步Bob就离成功少一步Alice每次走最右边
但是如果n-2*k==1的时候,中间只有1个格子,这样Alice一走,就帮了Bob的忙,所以Alice先走最右边的一个,这样,等于让Bob先走,就可提炼

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    int n;
    int k;
    int cnt=0;
    while(scanf("%d%d",&n,&k)==2)
    {
        cnt++;
        int cha=n-2*k;
        cout<<"Case "<<cnt<<": ";
        if(cha%2==0)
        {
            cout<<"Alice"<<" "<<"1"<<endl;
        }
        else if(cha%2==1)
        {
            if(k==1)
            {
                cout<<"Bob"<<endl;
            }
            else if(cha==1)
            {
                cout<<"Alice"<<" "<<k<<endl;
            }
            else
            {
                cout<<"Alice"<<" "<<"1"<<endl;
            }
        }
    }
    return 0;
}

感觉还是没讲明白。。 比赛花了2个小时找规律ORZ。。。

你可能感兴趣的:(HDU)