codeforces 496B. Secret Combination 解题报告

题目链接:http://codeforces.com/problemset/problem/496/B

题目意思:给出 n 位数你,有两种操作:1、将每一位数字加一(当某一位 > 9 时只保存个位数)   2、循环右移(最右边那个数字去到第一位上)。问经过若个两种操作的组合后,得到的最小数值为多少。

我一开始用了vector来做= =,没有考虑到循环右移的情况。以为每一位从1加到9之后,找出最小的那个就可以.....

  留个纪念(错误代码,别学,如果没有循环右移的限制,这个是对的)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <vector>
 6 using namespace std;
 7
 8 const int maxn = 1e3 + 5;
 9 vector<int> v[maxn];
10 int a[maxn];
11
12 int main()
13 {
14     #ifndef ONLINE_JUDGE
15         freopen("in.txt", "r", stdin);
16     #endif // ONLINE_JUDGE
17
18     int n;
19     char ch;
20     while (scanf("%d", &n) != EOF)
21     {
22         getchar();
23         v[10].clear();
24         for (int i = 0; i < n; i++)
25         {
26             scanf("%c", &ch);
27             a[i] = ch - ‘0‘;
28         }
29         for (int i = 0; i < 9; i++)
30         {
31             for (int j = 0; j < n; j++)
32             {
33                 int add = a[j] + (i+1);
34                 v[i].push_back(add % 10);
35             }
36             sort(v[i].begin(), v[i].end());
37         }
38         sort(v, v+10);
39         for (int i = 0; i < n; i++)
40             printf("%d", v[0][i], i == n-1 ? ‘ ‘ : ‘\n‘);
41     }
42     return 0;
43 }

  按照步骤一步一步模拟即可。但是需要用到 b 数组来还原原始的数字。还有就是循环右移其实等价于循环左移!最后就是strcmp() 放到 get_reverse() 后面,这样需要两个strcmp 判断(循环外的add后面),这样放置只需要用到一次 strcmp() 就行了。放置位置也是值得注意的,不要颠倒了。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6
 7 const int maxn = 1e3 + 5;
 8 char a[maxn];
 9 int n;
10
11 void add(char a[], int added)
12 {
13     for (int i = 0; i < n; i++)
14     {
15         int tmp = (a[i]-‘0‘ + added) % 10;
16         a[i] = tmp + ‘0‘;
17     }
18 }
19
20 void get_reverse(char a[])
21 {
22     char tmp = a[0];
23     for (int i = 1; i < n; i++)
24         a[i-1] = a[i];
25     a[n-1] = tmp;
26 }
27
28 int main()
29 {
30     #ifndef ONLINE_JUDGE
31         freopen("in.txt", "r", stdin);
32     #endif // ONLINE_JUDGE
33
34     while (scanf("%d", &n) != EOF)
35     {
36         getchar();
37         char b[maxn] = {‘0‘};
38         char ans[maxn] = {‘9‘};
39         for (int i = 0; i < n; i++)
40             scanf("%c", &a[i]);
41         for (int i = 0; i <= 9; i++)
42         {
43             strcpy(b, a);
44             add(a, i);
45             for (int j = 0; j < n; j++)
46             {
47                 if (strcmp(ans, a) > 0)
48                     strcpy(ans, a);
49                 get_reverse(a);
50             }
51             strcpy(a, b);
52         }
53         puts(ans);
54     }
55     return 0;
56 }
时间: 2024-10-25 15:58:51

codeforces 496B. Secret Combination 解题报告的相关文章

CodeForces 496B Secret Combination

Secret Combination Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 496B Description You got a box with a combination lock. The lock has a display showing n digits. There are two buttons

codeforces 591A. Wizards&#39; Duel 解题报告

题目链接:http://codeforces.com/problemset/problem/591/A 题目意思:其实看下面这幅图就知道题意了,就是Harry 和 He-Who-Must-Not-Be-Named 分别在走廊末端,各发射自己的impulse,其中Harry 的 impulse 速度为 p 米/s,He-...-Named (这个名字太长,姑且写成这样)为 q米/s.然后相遇之后各自回到它们的主人身边,再发射,问第二次相遇的时候,Harry的impulse 离他的位置距离是多少.

CodeForces 250B Restoring IPv6 解题报告

Description An IPv6-address is a 128-bit number. For convenience, this number is recorded in blocks of 16 bits in hexadecimal record, the blocks are separated by colons — 8 blocks in total, each block has four hexadecimal digits. Here is an example o

cf 496B Secret Combination

题目链接:B. Secret Combination You got a box with a combination lock. The lock has a display showing n digits. There are two buttons on the box, each button changes digits on the display. You have quickly discovered that the first button adds 1 to all th

Codeforces Round #277.5 解题报告

又熬夜刷了cf,今天比正常多一题,比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack,写写解题报告吧= =! 解题报告如下: A题:选择排序直接搞,因为不要求最优交换次数,代码: #include <iostream> #include <algorithm> #include <cstdio> #include <memory.h> #include <vector> #include <stack> #

codeforces 495B. Modular Equations 解题报告

题目链接:http://codeforces.com/problemset/problem/495/B 题目意思:给出两个非负整数a,b,求出符合这个等式      的所有x,并输出 x 的数量,如果 x 有无限多个,那么输出 infinity. 想了半个多小时......有个地方想遗漏了. a mod x == b,等价于  a = k*x + b.设 mul = a - b,那么 k*x = mul,然后就不断枚举 mul 的因子,即 kx = mul.由于 mod 出来的结果为 b,那么

codeforces 495A. Digital Counter 解题报告

题目链接:http://codeforces.com/problemset/problem/495/A 这个题目意思好绕好绕~~好绕~~~~~,昨天早上做得 virtual 看不懂,晚上继续看还是,差点就想求救 XX 兽了,最终还是打住,尽量不要依赖人嘛.今天终于想到了,大感动 ~_~ 理解能力有待提高... One of the sticks of the counter was broken    这句话有一点误导人的成分,我刚开始就以为只有一条 stick 坏了= =,再看这句 becau

codeforces 577B. Modulo Sum 解题报告

题目链接:http://codeforces.com/problemset/problem/577/B 题目意思:就是给出 n 个数(a1, a2, ..., an) 和 m,问能不能从这 n 个数中选出一些数(不能为空),使得这些数的总和能整除 m . 实不相瞒,完全没想法...看题解,有个地方看都看不懂: n > m的情况.求助乌冬子,连带被批英语水皮 >___<.还是谢谢他啦,一步一步引导我. 貌似挺多人也有这个疑惑的.他说那个是特例优化,原谅我懒,直接摘抄吧~ 首先知道一些参数.

codeforces 582A. GCD Table 解题报告

题目链接:http://codeforces.com/problemset/problem/582/A 网上很多题解,就不说了,直接贴代码= = 官方题解: http://codeforces.com/blog/entry/20692 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm>