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;
}

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

时间: 2024-12-22 19:56:23

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

Codeforces Round #536 E. Lunar New Year and Red Envelopes /// 贪心 记忆化搜索 multiset取最大项

题目大意: 给定n m k:(1≤n≤1e5, 0≤m≤200, 1≤k≤1e5) 表示n个时间长度内 最多被打扰m次 k个红包 接下来k行描述红包 s t d w:(1≤s≤t≤d≤n , 1≤w≤1e9) 表示在 s 到 t 的时间内都可开始获得该红包 该红包在时间 d 时才能完成获得 红包内有w硬币 在同一时间段内只能获得一个红包 不能同时获得两个及以上 求在被打扰的情况下使获得的红包硬币最少 是多少 用in out标记各红包可被获得的区间 用multiset维护在某个时间点可获得的红包有

Codeforces Div.301D Bad Luck Island(概率dp+记忆化搜索)

一道概率dp问题. 题目链接:http://codeforces.com/contest/540/problem/D 题目大意:一个岛上有r个石头,s个剪子,p个布,他们之间随机挑出两个相遇,如果不是相同物种,就会有一个消失,分别求出最后这座岛上只剩下一个物种的概率. 我们用dp[i][j][k]来存储i个石头,j个剪刀,k个布时,某物种的存活概率,共dp三次,算出三个物种分别的概率. 首先,我们需要把对应想求的物种概率初始化,这里以石头为例,那么对于i从1到r,不难理解dp[i][0][0]=

Codeforces 509F Progress Monitoring (区间dp 或 记忆化搜索)

F. Progress Monitoring time limit per test 1 second memory limit per test 256 megabytes Programming teacher Dmitry Olegovich is going to propose the following task for one of his tests for students: You are given a tree T with n vertices, specified b

Codeforces 148D Bag of mice:概率dp 记忆化搜索

题目链接:http://codeforces.com/problemset/problem/148/D 题意: 一个袋子中有w只白老鼠,b只黑老鼠. 公主和龙轮流从袋子里随机抓一只老鼠出来,不放回,公主先拿. 公主每次抓一只出来.龙每次在抓一只出来之后,会随机有一只老鼠跳出来(被龙吓的了...). 先抓到白老鼠的人赢.若两人最后都没有抓到白老鼠,则龙赢. 问你公主赢的概率. 题解: 表示状态: dp[i][j] = probability to win(当前公主先手,公主赢的概率) i:剩i只白

CodeForces 69D Dot (博弈+记忆化)

Description Anton and Dasha like to play different games during breaks on checkered paper. By the 11th grade they managed to play all the games of this type and asked Vova the programmer to come up with a new game. Vova suggested to them to play a ga

Codeforces 294B Shaass and Bookshelf(记忆化搜索)

题目 记忆化搜索(深搜+记录状态) 感谢JLGG //记忆话搜索 //一本书2中状态,竖着放或者横着放 //初始先都竖着放,然后从左边往右边扫 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[110][210][210];//dp[第几个][厚度][宽度] int n; int a[110],b[110]; int rec(int i,int th,

UVA - 10559 Blocks 和 Vasya and Binary String CodeForces - 1107E (dp OR 记忆化搜索)

UVA - 10559 Blocks 题意:消消乐,每次连续相同的可以消除,分数加上长度的平方,问最多可以获得几分全部消完 题解: 区间dp + 记忆化搜索 dp[i][j][k] : (区间 [i,  j] 后面带上一段和 j 颜色相同的且长度为 k )的消消乐最大积分 1.消最后一段颜色和 j 颜色相同的 dp[i][j][k] <-- dp[i][j-1][0] + (k+1)^2 2.对于i <= l < j, 如果 l 和 j 的颜色相同, 那么可以把 [l+1, j-1]消掉

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的局势

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\),这样的话