1.21小计

一如既往莫名其妙的水题之旅。话说机房为什么这么多一天一道题系列(喂喂),咳咳,闲话不多讲,正式迈入正题环节。
同样一如既往地只写有用的题,练手向的就不多写了……
P2002 [cf] 石江豪pk李震 //无聊的我又水了一道博弈论。
描述 Description
题目背景
石江豪最近爱上了一款叫《转熊英兽魔:说穿石路》(Tuhaos of China:Cardpackage)的游戏,这周的乱斗模式十分带感,规则是不会限制场上随从的数量。于是,他找到了李震,想和李震进行一次PK,而李震作为一个竞技游戏大神表示很愿意吊打他。不幸的是,他们的对战陷入了僵局。
鏖战了无数分钟之后进入了残局,石江豪和李震都已经获得了10个法力水晶,场上有n个随从,而且他们都是白板,第i个随从的生命值为ai。他们的牌库都打光了,手上只有隐藏职业的两个神秘法术,两个法术的效果分别是这样的:
1.熔岩爆裂,3费,对一个随从造成一点伤害,冻结所有随从,并将该牌洗入你的牌库。过载(7)
2.转生,2费,消灭一个血量为偶数的随从,然后召唤k个血量为被消灭随从一半的随从,然后在下回合将所有随从的攻击力降为0,并将该牌洗入你的牌库。过载(7)
不幸的是,他们两个的血量都被打成1了,而且都没有装备武器,这也就意味着,每个人在每轮都必须而且只能释放一个法术,而且,如果某人击杀了最后一个随从,他的对手会因为疲劳而炸掉,从而获得胜利。
现在轮到石江豪了,由于上回合他所使用的闪电风暴的过载效果,本回合也只剩3点法力水晶了,李震是大神级人物,当然能算出来每一轮该怎么打,而石江豪就不一样了,他想请问学编程的你,在此局面下,他是否有必胜的机会呢?
输入格式 Input Format
第一行两个整数,分别代表n和k。
第二行n个整数,第i个数代表ai。
输出格式 Output Format
如果石江豪有必胜的策略教李震做人,输出“DaDeBuCuo”。
如果石江豪必然败在李震大神手下,输出“WoHenBaoQian”。
样例输入 Sample Input
2 1
3 4
样例输出 Sample Output
DaDeBuCuo
时间限制 Time Limitation
1s
注释 Hint
数据范围:
对于30%的数据,n≤10,k≤5,ai≤20。
对于100%的数据,1≤n≤100000,1≤k≤1000000000,1≤ai≤1000000000。
来源 Source
来源:
Codeforces Round #334 Div.1 Problem C(603C) Lieges of Legendre
数据生成:闵梓轩
似乎在前面写过题解,不过再写一遍吧
首先对于这种组合游戏的题目,很容易想到利用SG函数来解。我们对于游戏的局势进行分类讨论:

当k是偶数的情况下,
我们可以知道如果要把一个偶数堆分成k个堆,相当于将局势转到一个新的组合游戏,这个组合游戏的每个堆规模相同,都为x,那么
f(2x)=f(x)⨁f(x)⨁⋯⨁f(x)k times=0
对于奇数堆的情况,我们可以一步走到偶数堆,所以状态就是1了
当k是奇数的情况,就相对麻烦一些了,
我们考虑偶数堆的情况,同上得到
f(2x)=f(x)⨁f(x)⨁⋯⨁f(x)k times=f(x)
,那么可以递归地求取结果,显然可以算出前几项的f(x)的值,那么可以递推知道f(x)的值是大于0的。
考虑奇数堆的情况,我们知道可以一步走到偶数堆,而偶数堆是大于0的,所以奇数堆一定是0
其中关于偶数堆大于0的情况证明起来就是通过前几项递推发现偶数项均大于0,而后面的奇数项状态只能转移到之前的偶数项,所以0状态不可达,那么它一定是0状态,而后面的偶数因为减1的转移状态已经可达0,那么状态一直传递下去,就能够归纳出这条性质。
一些不符合这些性质的小数据,可以直接通过打表得出,不会超过5,而且状态额转移方法很少,手算起来也很简单。//可耻地复制了之前写过的题解

#include <iostream>
#include <cstring>
#include <cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#define MAX 100007
using namespace std;
int n,k;
int a;
int f[MAX];
int dfs ( int x )
{
    if ( x < 6 ) return f[x];
    if ( x&1 ) return 0;
    else
        return dfs(x/2)==1?2:1;
}
int main ( )
{
     scanf ( "%d%d" , &n , &k ) ;
        int sum = 0;
        for ( int i = 0 ; i < n ; i++ )
        {
            scanf ( "%d" , &a );
            if ( k&1 )
            {        
                f[0] = f[2] = f[5] = 0;
                f[1] = f[3] = 1;
                f[4] = 2;
                if ( a < 6 )
                    sum^= f[a];
                else
                    sum^= a&1?0:dfs(a);
            }
            else
            {
                f[0] = f[3] = 0;
                f[1] = f[4] = 1;
                f[2] = 2;
                if ( a < 5 )
                    sum ^= f[a];
                else 
                    sum ^=  a&1?0:1;
            }
        }
        if ( sum ) cout<<"DaDeBuCuo"<<endl;
        else cout<<"WoHenBaoQian"<<endl; 
    return 0;
}

P1146 火车进站
描述 Description
有一个车站,每天都会有N辆车进站,进站按从1到N的顺序进站。现在车站的站长想让这些火车按照特定的顺序出站,问可以做到吗?
当N为5时,出站顺序若为1 2 3 4 5,可以做到,但是顺序若为5 4 1 2 3,则不行。

我们可以把火车进站就是压栈,出站则是弹栈。
输入格式 Input Format
一个N,在1000之内,下接一些出站序列,当读到一个0时,则这个测试数据结束。
输出格式 Output Format
对每个序列输出一行“Yes”或“No”。
样例输入 Sample Input

5
1 2 3 4 5
5 4 1 2 3
0

样例输出 Sample Output

Yes
No

时间限制 Time Limitation
1s
注释 Hint

来源 Source
教材

裸栈,似乎也没有什么可说的

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<utility>
#include<cstring>
#include<iomanip>
#include<cstdlib>
using namespace std;
int a[1200],now[1200];
int top=0,n;
int t=1;
int num=0;
bool check()
{
    top=0;
    num=0;
    t=1;
    for(int i=1;i<=n;i++)
    {
        a[++top]=i;
        while(now[t]==a[top]) 
        {
            if(now[t]==0) break;
            top--;
            t++;
            num++;
        }
    }
    if(num==n) return 1;
    else return 0;
}
int main()
{
    //freopen("add.in","r",stdin);
    //freopen("add.out","w",stdout);
    cin>>n;
    while(cin>>now[1])
    {
        if(now[1]==0) return 0;
        else 
        {
            for(int i=2;i<=n;i++)
                cin>>now[i];
        }
        if(check()) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

还有一道我连写题解的欲望都没有,裸floyed…………

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值