zoukankan      html  css  js  c++  java
  • 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
    ");
            }
            else{
                printf("Infinite
    ");
            }
        }
    }
    
    

    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
    ") * 0; }
    	for(int i = 1; i < s.size(); i++){
    			dp[i] = dp[i-1]; 
    		if (s[i] == 'w' || s[i] == 'm') return printf("0
    ") * 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
    ", dp[s.size()-1]%mod)*0; 
    } 
    

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

  • 相关阅读:
    Mongodb在window上启动
    java:JQuery(Ajax,JSON)
    SqlServer:SqlServer(sql,游标,定时作业,行转列,列转行,公用表达式递归,merge合并)
    java:WebService
    java:svn
    java:Echarts,POI
    java:LeakFilling(Other)
    java:activiti(工作流简介 )
    Linux:lvm磁盘分区,动态扩容
    java:dubbo
  • 原文地址:https://www.cnblogs.com/ygbrsf/p/12519600.html
Copyright © 2011-2022 走看看