10 29

  颓了好几天的blog 应该写写了 毕竟有些题目还是很不错的关键是dp 每次都推不出来 果然还是我太菜了.

今天 考的是牛客的比赛 质量还行 不过期望的分220 实际得分180/cy 好多神仙AK 各种崩溃 dp推不出来 图论不会写 很自闭反正... T1 100 T2 40 T3 40

这道题就很有意思了 典型的博弈问题 多个局面 考虑有向图游戏的和求SG函数 对于一个局面不同的石子个数不同 没有任何关系 仔细分析每一个局面。

对于1 必胜局 对于2 必败局 对于3 必败局...好像没什么规律 考虑偶数和奇数分开来看 偶数 我们后手是始终贴着先手下 可以发现只有先手不能走 所以偶数局面先手必败。

考虑大于1 的奇数局面 我们后手 的第一步下在先手第一步的棋子旁边的旁边 此时先手有两个位置不能下 而后手只有一个位置不能下 之后继续贴着先手下 可以发现还是先手败了 尽管能多下一个位置但是 被第一步反了一个位置形成类似于偶数的局面此时还是先手先下。

所以得到SG函数 除了1这个局面 其余所有局面都是0 然后求有向图游戏的和即可。

//单个局面偶数必败
//觉得单个局面除了1 剩下也是必败 直接异或好了
//#include<bits/stdc++.h>
#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<stack>
#include<algorithm>
#include<vector>
#include<cctype>
#include<utility>
#include<set>
#include<bitset>
#include<map>
#define INF 1000000000
#define ll long long
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define RI register ll
#define db double
#define pii pair<ll,ll>
#define mk make_pair
using namespace std;
char *fs,*ft,buf[1<<15];
inline char getc()
{
    return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
    int x=0,f=1;char ch=getc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
    return x*f;
}
int T;
int n,ans;
int main()
{
    T=read();
    while(T--)
    {
        ans=0;
        n=read();
        for(int i=1;i<=n;++i)
        {
            int x=read();
            if(x==1)ans^=1;
        }
        if(ans)puts("rabbit");
        else puts("hamster");
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/chdy/p/11768825.html