Codeforces Round #490 (Div. 3)

A、Mishka and Contest

思路:简单贪心。每次删掉首尾不超过k的元素,直到分别第一次遇到超过k的元素就不再继续删除即可。

AC代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <iostream>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <complex>
 9 #include <string>
10 #include <vector>
11 #include <set>
12 #include <map>
13 #include <list>
14 #include <deque>
15 #include <queue>
16 #include <stack>
17 #include <bitset>
18 using namespace std;
19 typedef long long LL;
20 typedef unsigned long long ULL;
21 const int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 上右下左
22 const int mx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}; // 马可走的八个方向
23 const int my[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
24 const double eps = 1e-6;
25 const double PI = acos(-1.0);
26 const int maxn = 105;
27 const int inf = 0x3f3f3f3f;
28
29 int n, k, ans, a[maxn];
30
31 int main() {
32     while(cin >> n >> k) {
33         ans = 0;
34         for(int i = 0; i < n; ++i) cin >> a[i];
35         for(int i = 0, j = n - 1; i <= j;) {
36             if(a[i] <= k) ++i, ++ans;
37             else if(a[j] <= k) --j, ++ans;
38             else break;
39         }
40         cout << ans << endl;
41     }
42     return 0;
43 }

B、Reversing Encryption

思路:暴力。简单按照n的所有公约数从小到大有序反转一下即可。

AC代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <iostream>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <complex>
 9 #include <string>
10 #include <vector>
11 #include <set>
12 #include <map>
13 #include <list>
14 #include <deque>
15 #include <queue>
16 #include <stack>
17 #include <bitset>
18 using namespace std;
19 typedef long long LL;
20 typedef unsigned long long ULL;
21 const int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 上右下左
22 const int mx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}; // 马可走的八个方向
23 const int my[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
24 const double eps = 1e-6;
25 const double PI = acos(-1.0);
26 const int maxn = 1e5+5;
27 const int inf = 0x3f3f3f3f;
28
29 int n;
30 string str;
31
32 int main() {
33     while(cin >> n >> str) {
34         for(int i = 1; i <= n; ++i)
35             if(n % i == 0) reverse(str.begin(), str.begin() + i);
36         cout << str << endl;
37     }
38     return 0;
39 }

C、Alphabetic Removals

思路:暴力。关联式容器multimap(键---值:一对多)的简单应用。注意:map.erase(迭代器)的结果只是被删元素的迭代器失效,但因为其返回值为void,所以要采用map.erase(it++)的方式删除被删元素的迭代器,此时it已经指向下一个迭代器的位置了。

AC代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <iostream>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <complex>
 9 #include <string>
10 #include <vector>
11 #include <set>
12 #include <map>
13 #include <list>
14 #include <deque>
15 #include <queue>
16 #include <stack>
17 #include <bitset>
18 using namespace std;
19 typedef long long LL;
20 typedef unsigned long long ULL;
21 const int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 上右下左
22 const int mx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}; // 马可走的八个方向
23 const int my[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
24 const double eps = 1e-6;
25 const double PI = acos(-1.0);
26 const int maxn = 4e5+5;
27 const int inf = 0x3f3f3f3f;
28
29 int n, k, len;
30
31 multimap<char, int> mp1;
32 multimap<char, int>::iterator it1;
33
34 map<int, char> mp2;
35 map<int, char>::iterator it2;
36
37 char str[maxn];
38
39 int main() {
40     while(cin >> n >> k >> str) {
41         len = strlen(str);
42         if(k == len) continue;
43         mp1.clear(); mp2.clear();
44         for(int i = 0; i < len; ++i) mp1.insert(make_pair(str[i], i));
45         // 注意:mp1.erase(迭代器)的结果只是被删元素的迭代器失效,但因为其返回值为void,所以要采用erase(it++)的方式删除被删元素的迭代器
46         for(it1 = mp1.begin(); k && (it1 != mp1.end()); --k) mp1.erase(it1++);
47         for(it1 = mp1.begin(); it1 != mp1.end(); ++it1) mp2[it1 -> second] = it1 -> first;
48         for(it2 = mp2.begin(); it2 != mp2.end(); ++it2) printf("%c", it2 -> second);
49         puts("");
50     }
51     return 0;
52 }

原文地址:https://www.cnblogs.com/acgoto/p/10693468.html

时间: 2024-08-30 15:31:24

Codeforces Round #490 (Div. 3)的相关文章

Codeforces Round #490 (Div. 3) B

传送门http://codeforces.com/contest/999/problem/B 一个长度为n的字符串t,将n的因子从大到小排个序(设为a[i]),每次把t的第一个字符到第a[i]个字符reverse一下,最终得到一个怪异的串s.现在给n和s,求t. 最长100个字符,直接模拟好了.先把n分解质因数,然后进行"逆操作",即把因子从小到大排序,然后把给的串reverse回去. 我在做的时候忘记reverse怎么用了,尴尬. 1 #include <iostream>

Codeforces Round #490 (Div. 3) F - Cards and Joy

F - Cards and Joy 思路:比较容易想到dp,直接dp感觉有点难,我们发现对于每一种数字要处理的情况都相同就是有 i 张牌 要给 j 个人分, 那么我们定义dp[ i ][ j ]表示 i 张牌给 j 个人分最大的价值可以得到dp方程如下: dp[ i ][ j ] = max(dp[ i - u ][ j - 1 ] + f[ u ] )   u <= k 暴力转移就好了. #include<bits/stdc++.h> #define LL long long #def

Codeforces Round #490 (Div. 3)-赛后补题

D. Equalize the Remainders 思维太僵硬了,我从余数入手,嫩是记录不了每个数要操作多少次.但是如果考虑每个数的贡献,即操作多少次能使得满足条件,就好写了,实际上也是暴力. #include<bits/stdc++.h> #define ll long long #define P pair<int,int> #define pb push_back #define lson root << 1 #define INF (int)2e9 + 7 #

Codeforces Round #490(Div.3) F

题目大意 n个人,每个人有一个lucky number,每个人抽k张卡片. 一个人如果抽到的卡片中有t个lucky number,这个人的价值为h[t]. 求最大的价值和. 解题思路 只需考虑带有lucky number的卡片,因为其他不是某个人的lucky number的卡片不会影响最后的价值. 不同的lucky number是不会相互影响的.因为如果把某个人lucky number放到另一个lucky number不一样的人那里,只会降低最后的总价值.h是升序的. 所以只需考虑有相同luck

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

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除