贪心 Codeforces Round #135 (Div. 2) C. Color Stripe

题目传送门

 1 /*
 2     贪心:当m == 2时,结果肯定是ABABAB或BABABA,取最小改变量;当m > 2时,当与前一个相等时, 改变一个字母
 3             同时不和下一个相等就是最优的解法
 4 */
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <algorithm>
 8 using namespace std;
 9
10 const int MAXN = 5e5 + 10;
11 const int INF = 0x3f3f3f3f;
12 char s[MAXN];
13
14 int main(void)  {       //Codeforces Round #135 (Div. 2) C. Color Stripe
15     //freopen ("C.in", "r", stdin);
16
17     int n, m;
18     while (scanf ("%d%d", &n, &m) == 2) {
19         scanf ("%s", s + 1);    int len = strlen (s + 1);
20
21        if (m == 2)    {
22             int c1 = 0, c2 = 0;
23             for (int i=1; i<=len; ++i)  {
24                 if (i & 1)  {
25                     if (s[i] == ‘A‘)    c2++;
26                     else    c1++;
27                 }
28                 else    {
29                     if (s[i] == ‘A‘)    c1++;
30                     else    c2++;
31                 }
32             }
33
34             printf ("%d\n", min (c1, c2));
35             for (int i=1; i<=len; ++i)  {
36                 if (i & 1)  printf ("%c", (c1 < c2) ? ‘A‘ : ‘B‘);
37                 else    printf ("%c", (c1 < c2) ? ‘B‘ : ‘A‘);
38             }
39             puts ("");
40         }
41         else    {
42             int ans = 0;    s[len+1] = s[0] = ‘@‘;
43             for (int i=2; i<=len; ++i)  {
44                 if (s[i] == s[i-1]) {
45                     ans++;
46                     for (int j=1; j<=m; ++j)    {
47                         char ch = ‘A‘ + j - 1;
48                         if (s[i] == ch || s[i+1] == ch) continue;
49                         else    {
50                             s[i] = ch;  break;
51                         }
52                     }
53                 }
54             }
55             printf ("%d\n", ans);   s[len+1] = ‘\0‘;
56             printf ("%s\n", s + 1);
57         }
58     }
59
60     return 0;
61 }
时间: 2024-10-10 10:32:18

贪心 Codeforces Round #135 (Div. 2) C. Color Stripe的相关文章

树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland

题目传送门 1 /* 2 题意:求一个点为根节点,使得到其他所有点的距离最短,是有向边,反向的距离+1 3 树形DP:首先假设1为根节点,自下而上计算dp[1](根节点到其他点的距离),然后再从1开始,自上而下计算dp[v], 4 此时可以从上个节点的信息递推出来 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 #include <vector> 10 using name

构造 Codeforces Round #135 (Div. 2) B. Special Offer! Super Price 999 Bourles!

题目传送门 1 /* 2 构造:从大到小构造,每一次都把最后不是9的变为9,p - p MOD 10^k - 1,直到小于最小值. 3 另外,最多len-1次循环 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 typedef long long ll; 12 const i

贪心 Codeforces Round #303 (Div. 2) B. Equidistant String

题目传送门 1 /* 2 题意:找到一个字符串p,使得它和s,t的不同的总个数相同 3 贪心:假设p与s相同,奇偶变换赋值,当是偶数,则有答案 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 #include <iostream> 10 using namespace std; 11 12 const int MAX

贪心 Codeforces Round #191 (Div. 2) A. Flipping Game

题目传送门 1 /* 2 贪心:暴力贪心水水 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 using namespace std; 8 9 const int MAXN = 1e2 + 10; 10 const int INF = 0x3f3f3f3f; 11 int a[MAXN]; 12 13 int main(void) //Codeforces Round #191

贪心 Codeforces Round #301 (Div. 2) B. School Marks

题目传送门 1 /* 2 贪心:首先要注意,y是中位数的要求:先把其他的都设置为1,那么最多有(n-1)/2个比y小的,cnt记录比y小的个数 3 num1是输出的1的个数,numy是除此之外的数都为y,此时的numy是最少需要的,这样才可能中位数大于等于y 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 using na

贪心 Codeforces Round #297 (Div. 2) C. Ilya and Sticks

题目传送门 1 /* 2 题意:给n个棍子,组成的矩形面积和最大,每根棍子可以-1 3 贪心:排序后,相邻的进行比较,若可以读入x[p++],然后两两相乘相加就可以了 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 typedef long long ll; 12 13 co

字符串处理/贪心 Codeforces Round #307 (Div. 2) B. ZgukistringZ

题目传送门 1 /* 2 题意:任意排列第一个字符串,使得有最多的不覆盖a/b字符串出现 3 字符串处理/贪心:暴力找到最大能不覆盖的a字符串,然后在b字符串中动态得出最优解 4 恶心死我了,我最初想输出最多的a,再最多的b,然而并不能保证是最多的:( 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <string> 9 #include <iostream> 10 #include <

找规律/贪心 Codeforces Round #310 (Div. 2) A. Case of the Zeros and Ones

题目传送门 1 /* 2 找规律/贪心:ans = n - 01匹配的总数,水 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 const int MAXN = 2e5 + 10; 12 const int INF =

贪心 Codeforces Round #263 (Div. 2) C. Appleman and Toastman

题目传送门 1 /* 2 贪心:每次把一个丢掉,选择最小的.累加求和,重复n-1次 3 */ 4 /************************************************ 5 Author :Running_Time 6 Created Time :2015-8-1 13:20:01 7 File Name :A.cpp 8 *************************************************/ 9 10 #include <cstdio>