Codeforces Round #597 (Div. 2) 解题报告 + 补题

mac2026-08-10  8

题目列表

A. Good ol’ Numbers Coloring B. Restricted RPS C. Constanze’s Machine D. Shichikuji and Power Grid

A. Good ol’ Numbers Coloring

题目链接 :a题链接

题目类型 : 数学、模拟

题目大意 :输入a、b 对 a 、b 倍数的方块涂成白色,其余的涂成黑色,(已知0处一定为白色),判断黑色方块的个数是否为无限个

解题思路 :i-a 每次经过的都是a的倍数 同理 i - b每次经过的都是b的倍数 a与b的最大公因数为1的话 i - a 未涂的方块在 i - b 涂色的过程中会被涂上,而如过最大公约数不是1的时候说明有a和b合作也无法涂白色的方块,那么当a和b以成倍数变大的时候未涂方块的个数也在增长,所以无限个

/** * This code has been written by YueGuang, feel free to ask me question. Blog: http://www.yx.telstudy.xyz * created: */ #include <cstdio> #include <iostream> #include <set> #include <map> #include <algorithm> #include <cstring> #include <string> #include <cmath> #define REP(i, a, b) for(int i = a; i < b; i++) #define REP_(i, a, b) for(int i = a; i <= b; i++) #define sl(n) scanf("%lld", &n); #define si(n) scanf("%d", &n); #define RepAll(a) for(auto x: a) #define cout(ans) cout << ans << endl; typedef long long ll; using namespace std; inline int gcd(int a, int b){return b == 0 ? a : gcd(b , a%b); } int main(){ int t; scanf("%d", &t); while(t--){ int a, b; scanf("%d%d",&a, &b); if(gcd(a, b) == 1){ printf("Finite\n"); } else{ printf("Infinite\n"); } } }

B. Restricted RPS

题目链接 :B题链接

题目类型 :模拟

题目大意 :输入t个测试样例。输入n表示有Alice和Bob进行n次交手,接下来输入啊a,b,c分别表示Ailce出石头、布、剪刀的次数,下一行输入一行字符串,分别用’R’ ‘S’ 'P’表示Bob每回合出的什么。赢输出YES输则输出NO

解题思路 :直接对输入的字符串进行判断每一步Alice应该出什么直接接到【string】ans的字符串上,并统计胜利次数,最后与n回合数进行判断,只要赢的回合数大于总回合数除以2向上取整的整数则输出YES然后输出胜利方式的字符串ans

技巧 : 我一开始的处理方式if else过多导致逻辑混乱,赛后看了别人的代码,是通过不会出现的字符‘ ?’去对暂时不知道出什么的回合进行解决,最后再通过一个for循环进行填补即可

/** * This code has been written by YueGuang, feel free to ask me question. Blog: http://www.yx.telstudy.xyz * created: */ #include <cstdio> #include <iostream> #include <set> #include <map> #include <algorithm> #include <cstring> #include <string> #include <cmath> #define REP(i, a, b) for(int i = a; i < b; i++) #define REP_(i, a, b) for(int i = a; i <= b; i++) #define sl(n) scanf("%lld", &n); #define si(n) scanf("%d", &n); #define RepAll(a) for(auto x: a) #define cout(ans) cout << ans << endl; typedef long long ll; using namespace std; void solve(int t){ while(t--){ int n, a, b, c; string str, ans; int flag = 0; scanf("%d%d%d%d", &n, &a, &b, &c); cin >> str;ans = str; for(int i = 0; i < n; i++){ ans[i] = '?'; if (str[i] == 'R' && b > 0) --b, ans[i] = 'P', ++flag; if (str[i] == 'P' && c > 0) --c, ans[i] = 'S', ++flag; if (str[i] == 'S' && a > 0) --a, ans[i] = 'R', ++flag; } if (flag < (n + 1)/2){puts("NO"); continue;} else { for(int i = 0; i < n; i++){ if (ans[i] != '?')continue; if (a) ans[i] = 'R', --a; else if (b) ans[i] = 'P', --b; else if (c) ans[i] = 'S', --c; } puts("YES");cout << ans << endl; } } return ; } int main(){ int t; scanf("%d", &t); solve(t); }

C. Constanze’s Machine

题目类型 :数学, dp

题目链接 : c题链接

题目大意 :给你一个字符串,其中有人将‘w’改变成了‘uu‘,将m改编成了‘nn’,现在要你通过这个字符串求解可能为原字符串的种数。

解题思路 :很清楚的指导,每存在一个nn或者石uu我们就多一种还原的可能,自然而然的我们就要去考虑连续n或者连续u的情况,我们要如何去计算还原的总数呢?

这里借用一下样例: nnn 有如下几种还原

mnnmnnn 那么我们可以发现,是否改变第三位的n取决于前两位是否还原成了m,如果还原成了那么我们就不能再对其进行操作了 每一步取决于上一步,这不就是动态规划的思想吗,没错,这一题的解题方法就是dp dp[0] = dp[1] = 1; dp[i] = dp[i] + dp[i - 2];因为是连续两个一样的 #include <iostream> using namespace std; const int mod = 1e9 + 7; const int maxn = 1e5 + 50; int dp[maxn]; int main(){ dp[0] = dp[1] = 1; string s; cin >> s; if(s[0] == 'w' || s[0] == 'm'){ return printf("0\n") * 0; } for(int i = 1; i < s.size(); i++){ dp[i] = dp[i-1]; if (s[i] == 'w' || s[i] == 'm') return printf("0\n") * 0; if (s[i] == 'u' && s[i - 1] == 'u'||s[i] == 'n' && s[i - 1] == 'n'){ i == 1 ? dp[i] = (dp[i] + 1)%mod : dp[i] = (dp[i]+dp[i-2])%mod; } } return printf("%d\n", dp[s.size()-1]%mod)*0; }

嘤语学习 : dumb 哑的;无说话能力的 prank 恶作剧,玩笑 tinker v. (徒劳地或马虎地)小修补;笨手笨脚地做事;做焊锅匠;焊补

最新回复(0)