Codeforces Round #216 (Div. 2) 解题报告

Problem A Valera and Plates

有碗和碟子两种容器,小明每天吃一种食物,食物有两种1只能用碗吃2两个容器都可。给你初始的碗与碟子问小明至少要洗多少个碗或碟子。

简单模拟,能用碟子就用碟子。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <stack>
10 #define INF 0x7fffffff
11 
12 using namespace std;
13 
14 int main()
15 {
16 //    freopen("in.txt", "r", stdin);
17 
18     int n, m, k, a, b;
19     while(scanf("%d%d%d", &n, &m, &k)!=EOF){
20         a = b = 0;int ans = 0;
21         for(int i=0; i<n; i++){
22             int temp;
23             scanf("%d", &temp);
24             if(temp==1){
25                 if(m)m--;
26                 else ans++;
27             }else{
28                 if(k)k--;
29                 else if(m)m--;
30                 else ans++;
31             }
32         }
33         printf("%d
", ans);
34     }
35     return 0;
36 }
View Code

Problem B Valera and Contest

有一个非减序列有n个元素每个元素都在【l,r】之间,告诉你前k个和为sk总和为sn让你输出一种序列的可能情况。

贪心,对于前k个最小值一定固定为sk/k剩下的值在前面sk%k上加一即可。对于后面n-k个一样处理。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <queue>
 9 #include <stack>
10 #define INF 0x7fffffff
11 
12 using namespace std;
13 
14 int main()
15 {
16 //    freopen("in.txt", "r", stdin);
17 
18     int n, k, l ,r, sa, sk;
19     int ans[10100];
20     while(cin >> n >> k >> l >> r >> sa >> sk){
21         for(int i=0; i<k; i++){
22             ans[i] = sk/k;
23         }
24         for(int i=0; i<sk%k; i++){
25             ans[i] ++;
26         }
27         if(n!=k){
28             for(int i=k; i<n; i++){
29                 ans[i] = (sa-sk)/(n-k);
30             }
31             for(int i=k; i<k+(sa-sk)%(n-k); i++){
32                 ans[i]++;
33             }
34         }
35         for(int i=0; i<n; i++){
36             printf("%d", ans[i]);
37             if(i!=n-1)cout << ' ';
38         }
39         cout << endl;
40     }
41     return 0;
42 }
View Code

 Problem C Valera and Elections

简单树形DP,思路超简单为什么比赛的时候没有想到0.0

dp[root] = sum(dp[k])k为所有儿子

当root所有的儿子都没有标记且root至其根节点的路是坏的时候把root标记一下。最后dfs返回值即为答案数目。

vis数组即为序列。

代码如下:

 1 #include <iostream>
 2 #include <fstream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <utility>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #define INF 0x7fffffff
13 #define LEN 101000
14 #define ll long long
15 #define eps 1E-6
16 
17 using namespace std;
18 
19 vector<pair<int,int> > Map[LEN];
20 int n, vis[LEN], vv[LEN];
21 
22 int DFS(int root, int fa)
23 {
24     int ret = 0, flag = 1;
25     for(int i=0; i<Map[root].size(); i++){
26 //        if(vv[i])continue;
27 //        vv[i] = 1;
28         if(Map[root][i].first==fa){
29             flag = Map[root][i].second;
30             continue;
31         }
32         ret+=DFS(Map[root][i].first, root);
33     }
34     if(ret==0 && flag==2)return vis[root]=1;
35     return ret;
36 }
37 
38 int main()
39 {
40 //    freopen("in.txt", "r", stdin);
41     while(scanf("%d", &n)!=EOF){
42         memset(vis, 0, sizeof vis);
43         memset(vv, 0, sizeof vv);
44         for(int i=0; i<LEN; i++)Map[i].clear();
45         for(int i=1; i<n; i++){     //build Map
46             int a, b, val;
47             scanf("%d%d%d", &a, &b, &val);
48             Map[a].push_back(make_pair(b, val));
49             Map[b].push_back(make_pair(a, val));
50         }
51         int ans = DFS(1, -1);
52         printf("%d", ans);
53         for(int i=1; i<=n; i++){
54             if(vis[i]){
55                 printf(" %d", i);
56             }
57         }
58         printf("
");
59     }
60     return 0;
61 }
View Code
奔跑吧!少年!趁着你还年轻
原文地址:https://www.cnblogs.com/shu-xiaohao/p/3450637.html