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

题目列表

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
有如下几种还原

  1. mn
  2. nm
  3. nnn
    那么我们可以发现,是否改变第三位的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. (徒劳地或马虎地)小修补;笨手笨脚地做事;做焊锅匠;焊补

发布了20 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43382350/article/details/102872072