B类-Codeforces Round #535 (Div. 3)C. Nice Garland

Codeforces Round #535 (Div. 3)C. Nice Garland

题意:

由‘R‘, ‘G‘ and ‘B‘ 三个字母组成的一个字符串,每两个相同的字母需要相差3,找出最小需要交换次数。

分析:

这个字符串的长度大于等于3的时候,一定是RBG这三个字符的某一个排列的循环。
RBG一共最多有6种排列方式{"RGB","RBG","BGR","BRG","GRB","GBR"};

所以直接暴力循环6次即可。

代码:

#include<iostream>
using namespace std;
string dir[6]={"RGB","RBG","BGR","BRG","GRB","GBR"};
int main(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    int minn=100000000;
    int flag=0;
    //cout<<dir[5][1];
    for(int j=0;j<6;j++){
        int count=0;
        for(int i=0;i<n;i+=3){
            if(s[i]!=dir[j][0]) count++;
            if(i+1 >= n)
            break;
            else if(s[(i+1)]!=dir[j][1]) count++;
            if(i+2 >= n)
            break;
            else if(s[(i+2)]!=dir[j][2]) count++;
        }
        if(count<minn){
            minn=count;
            flag=j;
        }
    }
    cout<<minn<<endl;
    int i;
    for(i=0;i + 3 <n;i+=3){
        cout<<dir[flag];
    }
    int j = 0;
    for(i;i < n;i++)
    cout << dir[flag][j++];

    //if(n%3==)
    return 0;
}//比赛结束了几分钟才改好,emmmmmmm,笨死啦。

原文地址:https://www.cnblogs.com/zhyyyy/p/10327787.html

时间: 2024-10-07 02:29:14

B类-Codeforces Round #535 (Div. 3)C. Nice Garland的相关文章

Codeforces Round #535 (Div. 3) 1108C - Nice Garland

#include <bits/stdc++.h> using namespace std; int main() { #ifdef _DEBUG freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); #endif int n; string s; cin >> n >> s; vector<in

Codeforces Round #535 (Div. 3)小上分记

Codeforces Round #535 (Div. 3)小上分记 前言 被拉去买新年衣服了,导致半小时后才进场. 虽然做了4道题,但是rating还是涨得不多. 用predictor看了rating变化后心灰意冷,不看E题了. A ...800的难度. B 本来还在想要不要用什么STL.后来发现直接用桶就行了.然后就可以水过了. C 题意差点理解不了. 就6种情况都去考虑一下,找最小代价的即可.不要考虑少了. 每次都是\(O(n)\)的,所以能搞. D 贪心地换字母即可. E 坑.待填. 原

Codeforces Round #535 (Div. 3) 题解

Codeforces Round #535 (Div. 3) 题目总链接:https://codeforces.com/contest/1108 太懒了啊~好久之前的我现在才更新,赶紧补上吧,不能漏掉了. A. Two distinct points 题意: 给出两个区间的左右边界,输出两个数,满足两个数分别在两个区间内且这两个数不相等. 题解: 直接输出左端点然后判断一下就行了. 代码如下: #include <bits/stdc++.h> using namespace std; type

Codeforces Round #535 (Div. 3) F

F. MST Unification 题目传送门 题意: 给你n个顶点,m条边:保证没有重边,其中存在多个MST(最小生成树), 你可以修改一些边的权值,让其中有且仅有一个最小生成树,求最少操作的边数. 思路: 最小生成树算法的加工,我们从kruskal算法入手,kruskal就是先对边排序, 然后遍历边不断加入一些合格边来完善最小生成树 那么在这个过程中,如果边的权值一样的话,就会产生多种MST,但是这里 不能仅仅只是累计相同权值的边数,因为与合格边相同权值的边可能可以选择 多条. 所以我们可

Codeforces Round #535 (Div. 3)

E: 题意: 给出n个整数ai和m个区间[li,ri] 你可以选择一些区间,并且将区间内的数字都减一.你要选择一些区间,然后使得改变后的数列中maxbi-minbi的值最大. 题解: 假设我们已经知道了这n个数中最大值的位置pmax,和最小值的位置pmin,那么对于一个区间[li,ri],有三种情况. 1.如果pmax和pmin在区间[li,ri]内,那么这个区间加不加都对答案没有贡献. 2.如果pmin在区间内pmax不在区间内,那么这个区间加上对答案的贡献就为1 3.如果pmax在区间内pm

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd