Codeforces 39E What Has Dirichlet Got to Do with That? 游戏+内存搜索

主题链接:点击打开链接

意甲冠军:

特定 a一箱 b球 不变n (球和箱子都不尽相同,样的物品)

设 way = 把b个球放到a个箱子中的方法数, 若way >= n则游戏结束

有2个人玩游戏。

若当前轮到 X时

1、 X选择添加一个箱子或添加一个球

2、若添加完后方法数>=n 则X失败

若先手必胜,则输出 Masha ,若先手必败则输出 Stas ,若为平局则输出 Missing

思路:

记忆化搜索

若当前给 a++ 或 b++都是会>=n 则当前局势必败

从当中不会>=n的局势中转移。

注意的是 若仅仅有一个箱子。且再添加一个箱子就会>=n 的情况,那么必定仅仅能添加b,那么一定无解

若仅仅有一个球,且再添加一个球就无解的情况,那么仅仅能添加a ,则依据 n - a 的奇偶性即能到当前局势

#include <cstdio>
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
#define ll long long
ll n, a, b;
bool win(ll x, ll y){ // x个箱子y个球 这个点是必败态
    ll tmp = 1;
    for(ll i = 1; i <= y; i++) {
        tmp*=x;
        if(tmp>=n)return true;
    }
    return false;
}
map<pair<ll,ll> , ll> mp;
ll dfs(ll x, ll y){ //这个点的状态
    if(mp.find(pair<ll,ll>(x,y)) != mp.end())
        return mp[pair<ll,ll>(x,y)];
    if(x==1 && win(2, y))
        return mp[pair<ll,ll>(x,y)] = -1;
    if(y==1 && win(x,2)){
        if((n-x)&1)return mp[pair<ll,ll>(x,y)] = 0;
        return mp[pair<ll,ll>(x,y)] = 1;
    }
    if(win(x,y))return mp[pair<ll,ll>(x,y)] = 1;
    ll u = win(x+1,y), v = win(x,y+1);
    if(u==1&&v==1)
        return mp[pair<ll,ll>(x,y)] = 0;
    if(u == 0)u = dfs(x+1, y);
    if(v == 0)v = dfs(x, y+1);
    if(u == 0 || v == 0)
        return mp[pair<ll,ll>(x,y)] = 1;

    if(u==-1||v==-1)return mp[pair<ll,ll>(x,y)] = -1;
    return mp[pair<ll,ll>(x,y)] = 0;
}
int main(){
    ll a,b;
    while(cin>>a>>b>>n){
        mp.clear();
        if(win(a+1,b) && win(a,b+1)){
            puts("Stas");
            continue;
        }
        if(b==1 && win(a,2)) {
            if(!((n-a)&1))puts("Masha");
            else puts("Stas");
            continue;
        }
        ll tmp = dfs(a,b);
        if(tmp<0)puts("Missing");
        else
        tmp ? puts("Masha"):puts("Stas");
    }
    return 0;
}
时间: 2024-10-13 09:09:46

Codeforces 39E What Has Dirichlet Got to Do with That? 游戏+内存搜索的相关文章

Codeforces 39E What Has Dirichlet Got to Do with That? 博弈+记忆化搜索

题目链接:点击打开链接 题意: 给定 a个箱子 b个球 常数n (球和箱子都是各不相同的,不会出现有一样的物品) 设 way = 把b个球放到a个箱子中的方法数, 若way >= n则游戏结束 有2个人玩游戏. 若当前轮到 X时 1. X选择增加一个箱子或增加一个球 2.若增加完后方法数>=n 则X失败 若先手必胜,则输出 Masha ,若先手必败则输出 Stas ,若为平局则输出 Missing 思路: 记忆化搜索 若当前给 a++ 或 b++都是会>=n 则当前局势必败 从其中不会&

CF 39E. What Has Dirichlet Got to Do with That?(记忆化搜索+博弈论)

传送门 解题思路 首先很好写出一个\(O(ab)\)的记搜,但发现这样无法处理\(a=1\)和\(b=1\)的情况,这两种情况需要特判.首先\(a=1\)的情况,就是如果当前选手让\(a+1\)必胜,那么他一定会给\(a+1\),否则会给\(b+1\),如果到\(2^b>n\)时,说明谁动\(a\)谁输,就是平局了,这样的话可以模拟这个过程不断给\(b+1\)即可.第二种情况是\(b=1\),这种情况一定没有平局,那么就和刚才一样模拟即可.最后一种情况是\(a=1\)并且\(b=1\),这样的话

codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)

题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删就输了 数据范围: $1\leq n \leq 100000$ $1\leq q \leq 100000$ $1\leq |s| \leq 40$ 分析: ac代码: #include<bits/stdc++.h> using namespace std; #define ll long long

LDA-math-认识Beta/Dirichlet分布

http://cos.name/2013/01/lda-math-beta-dirichlet/#more-6953 2. 认识Beta/Dirichlet分布2.1 魔鬼的游戏—认识Beta 分布 统计学就是猜测上帝的游戏,当然我们不总是有机会猜测上帝,运气不好的时候就得揣度魔鬼的心思.有一天你被魔鬼撒旦抓走了,撒旦说:“你们人类很聪明,而我是很仁慈的,和你玩一个游戏,赢了就可以走,否则把灵魂出卖给我.游戏的规则很简单,我有一个魔盒,上面有一个按钮,你每按一下按钮,就均匀的输出一个[0,1]之

Codeforces 351B Jeff and Furik

http://codeforces.com/problemset/problem/351/B 题意:两个人轮流游戏,先手交换相邻两个数,后手先抛硬币,正面就左大右小换,反面就右大左小换,随机找到一对数,直到整个数列上升位置,求最小期望步数. 思路:由于第一个人每次都会减少一对逆序对,而后手会50%减少一对,50%增加一对,我们把两个人凑起来就是: 50%逆序对不变,50%减少2对 f[i]=f[i]*0.5+f[i-2]*0.5 算出来就是f[i]=f[i-2]+4,初值:f[0]=0,f[1]

Codeforces 2A Winner (map运用)

Winner Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on CodeForces. Original ID: 2A 64-bit integer IO format: %I64d      Java class name: (Any) Prev Submit Status Statistics Discuss Next Type: None None Graph Theory      2-SAT 

幸运数的各位和[Codeforces-109A]

Codeforces Beta Round #84 (Div. 1 Only)  时间限制2000ms,内存限制256MB 问题大意:定义幸运数为十进制表示只包含4.7两个数码的数.例如47.744.4都是幸运数,而5.17.467不是. 已知一个幸运数的各位之和,求满足条件的幸运数的最小值.输入保证$1≤n≤10^6$. 这题用暴力方法就可以做.需要注意题目中的几个信息: 1)输入可能达到$10^6$,因此原数必然超过$10^6÷9>10^5$,因此无论用32位还是64位整数是不可能表示的下的

LDA主题模型浅析

上个月参加了在北京举办SIGKDD国际会议,在个性化推荐.社交网络.广告预测等各个领域的workshop上都提到LDA模型,感觉这个模型的应用挺广泛的,会后抽时间了解了一下LDA,做一下总结: (一)LDA作用 传统判断两个文档相似性的方法是通过查看两个文档共同出现的单词的多少,如TF-IDF等,这种方法没有考虑到文字背后的语义关联,可能在两个文档共同出现的单词很少甚至没有,但两个文档是相似的. 举个例子,有两个句子分别如下: "乔布斯离我们而去了." "苹果价格会不会降?&

主题模型-LDA浅析

(一)LDA作用 传统判断两个文档相似性的方法是通过查看两个文档共同出现的单词的多少,如TF-IDF等,这种方法没有考虑到文字背后的语义关联,可能在两个文档共同出现的单词很少甚至没有,但两个文档是相似的. 举个例子,有两个句子分别如下: “乔布斯离我们而去了.” “苹果价格会不会降?” 可以看到上面这两个句子没有共同出现的单词,但这两个句子是相似的,如果按传统的方法判断这两个句子肯定不相似,所以在判断文档相关性的时候需要考虑到文档的语义,而语义挖掘的利器是主题模型,LDA就是其中一种比较有效的模