首页 > 其他分享 > LY1371 [ 20231007 NOIP 模拟赛 T0 ] 十一之争

LY1371 [ 20231007 NOIP 模拟赛 T0 ] 十一之争

时间:2023-10-07 18:55:06浏览次数:33  
标签:11 return NOIP 20231007 int sum LY1371 step include

题意

给定一个长度为 \(n\) 的数字串 \(s\) 和只包含 yo 的字符串 \(t\),yoimiya 会和 oimiya 玩 \(n\) 轮游戏,初始有一个数字串 \(x\) 为 \(0\),每次:

  • 如果 \(t_i\) 是 y 则是 yoimiya 操作,如果是 o 则是 oimiya 操作。
  • 每次操作:将 \(s_i\) 或者 \(0\) 加入 \(x\) 的末尾。

如果最后 \(x\) 是 \(11\) 的倍数,那么 yoimiya 获胜,否则 oimiya 获胜。

假设两人都是绝顶聪明的,那么最后谁会获胜?

Sol

简单博弈论,考虑博弈 dp。

\(f_{ij}\) 表示第 \(i\) 次操作,当前 \(x mod 11 = j\) 是否获胜。

转移显然是 trivial 的,\(O(n)\)。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <ctime>
#define int long long
using namespace std;
/* #ifdef ONLINE_JUDGE */

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

/* #endif */
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
string read_() {
	string ans;
	char c = getchar();
	while (c < '0' || c > '9')
		c = getchar();
	while (c >= '0' && c <= '9') {
		ans += c;
		c = getchar();
	}
	return ans;
}
string read__() {
	string ans;
	char c = getchar();
	while (c < 'a' || c > 'z')
		c = getchar();
	while (c >= 'a' && c <= 'z') {
		ans += c;
		c = getchar();
	}
	return ans;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}

const int N = 1e6 + 5;
array <int, N> isl;
array <array <int, 12>, N> f;

string s1, s2;
bool dfs(int step, int sum, int n) {
	if (~f[step][sum]) return f[step][sum];
	if (step == n) {
		if (!sum) return true;
		else return false;
	}
	bool tp1 = dfs(step + 1, (sum + isl[step + 1]) % 11, n),
		tp2 = dfs(step + 1, sum, n);
	if (s2[step + 1] == 'y')
		return f[step][sum] = (tp1 || tp2);
	else
		return f[step][sum] = (tp1 && tp2);
}
signed main() {
	freopen("yo.in", "r", stdin);
	freopen("yo.out", "w", stdout);
	int n = read();
	s1 = " " + read_(), s2 = " " + read__();
	array <int, 12> tp;
	tp.fill(-1);
	f.fill(tp);
	int idx = 1;
	for (int i = n; i; i--) {
		isl[i] = (s1[i] - '0') * idx % 11;
		idx = idx * 10 % 11;
	}
	if (dfs(0, 0, n))
		puts("yoimiya");
	else
		puts("oimiya");
	return 0;
}

标签:11,return,NOIP,20231007,int,sum,LY1371,step,include
From: https://www.cnblogs.com/cxqghzj/p/17747191.html

相关文章

  • Ynoi2012 NOIP2016 人生巅峰
    Day\(\text{XXX}\)。注意到修改是易于复合的立方操作,而且值域非常小,所以可以直接\(O(v\logm)\)预处理出对每个\(i\in[0,v)\)操作了\(2^{j}\lem\)次的结果,维护出每一位被修改了多少次,查询某一位的值直接倍增\(O(\logm)\)即可。然后这个限制很弱,因为如果区间内有重复......
  • 33dai NOIP2023模拟赛35 赛后总结
    做题历程8:00~8:40写A。8:40~9:40看B,C想B,写B。9:40~10:40手玩了一下C,推出了那个规律。10:40~11:20写C。11:20~12:00看了看D,尝试写dp暴力,没空,最后随便写了写。总结写代码要注意细节,不然容易挂。题解A倒序做一遍双指针,没什么好说的。不过有很多人用奇......
  • 2023年石门中学NOIP模拟测试(2023.10.6)
    原题大战T1范围\(n\leq10^{14}\)。不用动脑,打个表找找规律。考虑一个数\(x\),在\(1\simn\)中包含\(x\)这个约数的个数为\(\left\lfloor\dfrac{n}{x}\right\rfloor\),那么既然是异或,只需要判断奇偶性算贡献即可。然后你发现这玩意显然可以整除分块,算连续一段贡献,只需......
  • 【基环树 | 题解】P5022 [NOIP2018 提高组] 旅行
    前言一日知基环树弱,固补题。关于基环树基环树定义一个环,环上每个点都有一颗以该点为根的树,如下图为一棵基环树关于基环树常规思路通常来说基环树常规思路是先处理环上树的结果,后通过树的结果来处理换上结果。具体处理方式依照题目来定。然而只是通常来说因为基环树的问......
  • NOIP A层联测5
    T1漂亮大厨(cook)教主的魔法+高橋君=漂亮大厨。先求出每次询问有多少个数小于等于\(y\),再统计答案。区间加,区间查小于等于某个数个数,考虑分块,块内再维护一个有序序列。区间加:散块直接加,暴力排序重构有序序列;整块打标记。区间小于等于某个数个数:散块暴力累加;整块在有序序列......
  • P1025 [NOIP2001 提高组] 数的划分 题解
    题目传送门本题共有两种方法,分别是递归深搜和动态规划方法一:递归深搜Solution从小到大一一枚举每一个划分的数,。只要找到一种方案就记录,具体细节代码中有注释。Code#include<bits/stdc++.h>usingnamespacestd;intn,k,ans;voiddfs(intstart,intstep,intsum){......
  • P1054 [NOIP2005 提高组] 等价表达式
    P1054[NOIP2005提高组]等价表达式这个题在计算表达式时可能会出现高次方,比如在某一数据中就出现了2^7^10也就是\(2^{70}\)自然溢出会寄,所以要取模自然溢出\(80\)分ullquick_pow(ullx,ullp){ ullres=1; while(p) { if(p&1)res*=x; p>>=1;......
  • NOIP2022 比赛
    Day\(2^2+3^2+4^2\)。HNOI2016序列的加强版。我去年怎么这么菜啊,虽然现在也是就是了。\[\sum\limits_{[l,r]\in[L,R]}\left(\max\limits_{i\in[l,r]}a_i\right)\left(\max\limits_{i\in[l,r]}b_i\right)\]考虑离线,对右端点\(r\)扫描线,对每个左端点\(l\)维护\(S_l=\le......
  • NOIP2023 国庆集训 A 组 Day7
    T1思路:因为只有三个串故枚举其中一个为调换的串,再枚举k验证即可。T2思路:正着不好做,考虑反着做。这样就不会覆盖之前的。赛时没想到这个常见套路,正难则反。T3事实上只有一种情况,故只需倒着枚举遇到a统计答案。使用一个变量sum来记录遇到下一个a的次数如果枚举到b,sum+=1。......
  • 【题解】洛谷 P1003 [NOIP2011 提高组] 铺地毯
    原题链接解题思路如果直接按照题意开一个二维数组来模拟每个点最上面的地毯编号,会发现所占空间最坏情况下约为(2*105)2*4B=4*1010*4B=1.6*1011B≈149GB,程序完全无法运行。但实际上没有必要将每一个点的信息记录下来,只需要记录每一块地毯能覆盖哪些点,再依次判断哪那些地毯可以......