zoukankan      html  css  js  c++  java
  • 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
    奔跑吧!少年!趁着你还年轻
  • 相关阅读:
    Docker——搭建SFTP
    PicGo——利用PicGo和GitHub搭建免费图床提供给Typecho使用
    GitHub——如何生成Personal access tokens
    leetcode——两数相加【二】
    每天一道面试题——请实现add(1,2)(3)【二】
    leetcode——两数之和【一】
    每天一道面试题——JavaScript的this指向【一】
    PHP——安装ThinkPHP框架报错
    项目代码 if/else 过多,引起程序猿口吐莲花
    JDK9-JDK14 相关新特性说明及使用
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3450637.html
Copyright © 2011-2022 走看看