小红的删数字(博弈)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小红的删数字(博弈)相关的知识,希望对你有一定的参考价值。

小红的删数字(博弈)

因为只与 3 3 3的倍数有关,因此对数位模3,且原数位为0不用考虑。

对于开始的数位的和模 3 3 3的值 v v v

第一步小红肯定要删一个 a i ( m o d 3 ) = v a_i\\pmod 3 = v ai(mod3)=v 的数位。

如果不存在直接输出小紫赢。

否则变成小紫先手,每次可选 x = 1 x=1 x=1或者 x = 2 x=2 x=2,然后小红必须删除另一个。

且小紫先手,若 a 1 ≠ a 2 a_1\\ne a_2 a1=a2 小紫可以选择多的那个必赢。

因此 a 1 = a 2 a_1=a_2 a1=a2时,刚好可以抵消完,且小红最后一次操作得满足要求,即操作完之后数字为正整数,因此必须存在 a 0 > 0 a_0>0 a0>0,统计的时候不要统计原数位为 0 0 0的数位。

// Problem: 小红的删数字
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11251/C
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Date: 2022-08-11 13:45:00
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define sz(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

template <typename T>		//x=max(x,y)  x=min(x,y)
void cmx(T &x,T y)
	if(x<y) x=y;

template <typename T>
void cmn(T &x,T y)
	if(x>y) x=y;

int a[3];
int main()
	string s;
	cin>>s;int n=sz(s);
	int v=0;
	for(char c:s)
		if(c-'0')
		a[(c-'0')%3]++,v+=c-'0';
	v%=3;
	if(!a[v%3]) return puts("yukari"),0;
	a[v%3]--;
	if(a[1]==a[2]&&a[0]) return puts("kou"),0;
	else puts("yukari"),0;
	return 0;


以上是关于小红的删数字(博弈)的主要内容,如果未能解决你的问题,请参考以下文章

博弈论

BZOJ3759: Hungergame 博弈论+线性基

Atcoder Grand Contest 026 (AGC026) F - Manju Game 博弈,动态规划

#yyds干货盘点# 动态规划专题:数位染色

算法简单博弈论

博弈论-威佐夫博弈