Codeforces Round #436 (Div. 2)【A、B、C、D、E】

Codeforces Round #436 (Div. 2)

敲出一身冷汗。。。感觉自己宛如智障:(

codeforces 864 A. Fair Game【水】

题意:已知n为偶数,有n张卡片,每张卡片上都写有一个数,两个人每人选一个数,每人可以拿的卡片必须写有是自己选的数,问能否选择两个数使得两个人每人拿的卡片数一样多并且能拿光卡片。[就是看输入是不是只有两种数字]

//:第一遍我看成字符串包含有选的数字也能拿,,这样写着居然过了。。水题水题。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=101;
 6 int n, a[N];
 7 int main() {
 8     int i, k, x=0, y=0;
 9     scanf("%d", &n);
10     for(i = 1; i <= n; ++i){
11         scanf("%d", &k);a[k]++;
12         if(!x) x=k; else if(k!=x) y=k;
13     }
14     if(a[x]==a[y] && a[x]+a[y]==n){printf("YES\n%d %d\n", x, y);}
15     else puts("NO");
16     return 0;
17 }

15ms

codeforces 864 B. Polycarp and Letters【水】

题意:给一个只包含大写字母和小写字母的字符串,现在有一个集合,它可以包含字符串中的不同小写字母的位置,但是要求其任意两个位置之间在字符串中不能有大写字母。求集合最大的大小。

题解:线性暴力扫过去,求每段大写字母之间包含的最多的不同小写字母数量。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 #include<set>
 7 using namespace std;
 8 const int N=201;
 9 int n;
10 string s;
11 set<char>st;
12 int main() {
13     int i, j, k, m = 0;
14     scanf("%d", &n);
15     cin >> s;   s += ‘Z‘;
16     for(i = 0; i <= n; ++i) {
17         if(s[i] >= ‘A‘ && s[i] <= ‘Z‘) st.clear();
18         else {st.insert(s[i]); m = max(m, (int)st.size());}
19     }
20     printf("%d\n", m);
21     return 0;
22 }

15ms

codeforces 864 C. Bus【模拟】

题意:有个x轴,汽车从0出发到x=a,再返回到0,一直做这样的往返运动,现在规定0->a或a->0都算一次旅行,并且一开始汽车油箱有b升油,每走一个单位要消耗一升油,现在知道x=f位置处有个加油站,每次经过可以选择加油或不加,加的话可以加满到b升,要求完成k次旅行,求最少的加油次数。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int main() {
 6     int a, b, f, k, i, j;
 7     scanf("%d%d%d%d", &a, &b, &f, &k);
 8     int num = 0, ed = b;
 9     if(k>2&&b<2*f || k>1&&b<2*(a-f) || b<f || b<a-f) {puts("-1"); return 0;}
10     for(i = 1; i <= k; ++i) {
11         if(i == k && ed >= a) break;
12         if(i%2) {
13             if(ed<2*a-f) {num++; ed = b-(a-f);}
14             else ed -= a;
15         }
16         else {
17             if(ed<a+f) {num++; ed = b-f;}
18             else ed -= a;
19         }
20     }
21     printf("%d\n", num);
22     return 0;
23 }

15ms

codeforces 864 D. Make a Permutation!【贪心】

题意:每次可以任意改变数组中的一个数,要求把数组变成1~n,求改变数的最小数量和最后的字典序最小的数组。

题解:因为要字典序最小,顺序访问没出现的数,将其与重复了的数进行判断,小的话直接替换,否则若重复的数已经被标记,则也进行替换。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N = 2e5+1;
 6 int n, a[N], num[N], vis[N];
 7 int main() {
 8     int i, j, k, cnt = 0, x = 1;
 9     memset(vis, 0, sizeof(vis));
10     memset(num, 0, sizeof(num));
11     scanf("%d", &n);
12     for(i = 0; i < n; ++i) {scanf("%d", &a[i]); num[a[i]]++;}
13     for(i = 0; i < n; ++i) {
14         for(; num[x]; ++x);
15         if(num[a[i]]>1 && (x < a[i] || vis[a[i]])) {
16             num[a[i]]--; num[a[i]=x]++; ++cnt;
17         }
18         else vis[a[i]] = 1;
19     }
20     printf("%d\n", cnt);
21     for(i = 0; i < n-1; ++i) printf("%d ", a[i]);
22     printf("%d\n", a[n-1]);
23     return 0;
24 }

93ms

codeforces 864 E. Fire【DP】

题意:已知第i个文件:保存所需的时间为ti,到了时间di则会毁坏,和可得的价值pi。求能保存的文件的最大价值和,以及能保存的文件的编号。

题解:给d小的赋予高优先级再对文件排序。dp[j]表示在j时间前保存的文件所能得到的最大价值和,并对选择保存的文件进行标记。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N = 101;
 6 const int M = 2001;
 7 int n;
 8 int dp[M], vis[N][M];
 9 struct node {
10     int t, d, p, id;
11     bool operator < (const node&r) const{
12         return d < r.d;
13     }
14 }a[N];
15 int b[N];
16 int main() {
17     int i, j, k, t, ed = 0, cnt = 0;
18     memset(dp, 0, sizeof(dp)); memset(vis, 0, sizeof(vis));
19     scanf("%d", &n);
20     for(i = 1 ; i <= n; ++i) {
21         scanf("%d%d%d", &a[i].t, &a[i].d, &a[i].p);
22         a[i].id = i;
23     }
24     sort(a+1, a+1+n);
25     for(i = 1; i <= n; ++i) {
26         t = a[i].t;
27         for(j = a[i].d-1; j >= t; --j) {
28             if(dp[j] < dp[j-t]+a[i].p) {
29                 dp[j] = dp[j-t] + a[i].p;
30                 vis[i][j] = 1;
31             }
32         }
33     }
34     for(i = 1; i < a[n].d; ++i) if(dp[i]>dp[ed]) ed = i;
35     printf("%d\n", dp[ed]);
36     for(i = n; i >= 1; --i) {
37         if(vis[i][ed]) {b[cnt++] = a[i].id; ed -= a[i].t;}
38     }
39     printf("%d\n", cnt);
40     for(i = cnt-1; i > 0; --i) printf("%d ", b[i]);
41     if(cnt) printf("%d\n", b[0]);
42     return 0;
43 }

15ms

时间: 2024-11-08 09:35:18

Codeforces Round #436 (Div. 2)【A、B、C、D、E】的相关文章

Codeforces Round #436 (Div. 2) C. Bus

Codeforces Round #436 (Div. 2) C. Bus A bus moves along the coordinate line Ox from the point x = 0 to the point x = a. After starting from the point x = 0, it reaches the pointx = a, immediately turns back and then moves to the point x = 0. After re

【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!

题意:给你一个长度为n的数组,每个元素都在1~n之间,要你改变最少的元素,使得它变成一个1~n的排列.在保证改动最少的基础上,要求字典序最小. 预处理cnt数组,cnt[i]代表i在原序列中出现的次数.b数组,代表没有出现过的数是哪些.b数组的长度就是答案. b数组是从小到大排好的,然后for循环b数组,同时用一个指针p指着a数组的当前位置,最开始指向开头,如果cnt[a[p]]==1,就向后跳,否则再看 是否b[i]<a[p]或者a[p]这个数是否已经出现过了(用个hav数组表示a[p]是否已

Codeforces Round #436 (Div. 2) F Cities Excursions

题意是给你一个有向图,点n <= 3000, 边m <= 3000,从s到t的路径必须是最小字典序,q<=400000次询问,从s到t中路径第k个点是什么,否则输出-1. 7 7 51 22 31 33 44 55 34 61 4 22 6 11 7 31 3 21 3 5 解释下样例2-6. 2-6的路径为2-3-4-5-3-5-3...-5-6无限循环,所以可以当作这个路径不存在,所以为-1 1-3的路径为1-2-3 如果在线做复杂度肯定要高,把询问的边存储,枚举出发点离线解决 用v

[Codeforces] Round #436 (Div. 2)

1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int n,cnt,ans,A,B; 6 int buck[500]; 7 8 int main(){ 9 scanf("%d",&n); 10 11 for(int i = 1;i <= n;i++){ 12 cin >> cnt; 13 if(!buck[cnt]){ 14 ans++; 15 if(

Codeforces Round #436 (Div. 2) B.Polycarp and Letters

因为难得又一次CF的比赛是非常清真的傍晚,超级少见啊 所以当然要打啦,于是rank:87,rating+=76,滞留在上紫的边缘 下面把几道觉得还不错的题目来总结一下 B.Polycarp and Letters Polycarp loves lowercase letters and dislikes uppercase ones. Once he got a string s consisting only of lowercase and uppercase Latin letters.

Codeforces Round #436 (Div. 2) E. Fire

题意:给你n个需要救得东西,每个东西给出t,d,p,表示需要花费t时间,在d时间之前,价值为p,问救出最多价值,并把每个东西序号输出,比如  3  3  4 ,这就无法救出 思路:dp,dp[i][j]表示救出第i个花费j时间救出最大价值,dp[i][j]=max(dp[i][j],dp[i-1][j-a[i][d]]+a[i].val)(j<=2000),再记录个g[i][j]表示第i个东西在j时间是救出来的,然后倒推 1 #include<bits/stdc++.h> 2 using

A. Little C Loves 3 I Codeforces Round #511 (Div. 2) 【数学】

题目: Little C loves number ?3? very much. He loves all things about it. Now he has a positive integer nn. He wants to split nn into 3 positive integers a,b,ca,b,c, such that a+b+c=na+b+c=n and none of the 3 integers is a multiple of 3. Help him to fin

C. Enlarge GCD Codeforces Round #511 (Div. 2)【数学】

题目: Mr. F has nn positive integers, a1,a2,-,an. He thinks the greatest common divisor of these integers is too small. So he wants to enlarge it by removing some of the integers. But this problem is too simple for him, so he does not want to do it by

Codeforces Round #609 (Div. 2) 【A,B,C】

题意:给一个n<=1e7,找两个合数a和b使得a-b的差为n. 构造a=3n,b=2n,必含有公因子n,只有当n是1的时候是特例. 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define inf 0x3f3f3f3f3f3f 6 #define N 300009 7 int arr[]={2,3,5,7,13}; 8 signed main(){ 9 int n;scanf(