• Codeforces Round #379 (Div. 2)


    A :题意比较字符串中A和D的个数,输出获胜者的名字

     

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
        int n;
        string s;
    
        cin >> n>>s;
        int sum = 0, sum2 = 0;
        for(int i = 0; i < n; i++){
            if(s[i] == 'A') sum++;
            else sum2++;
        }
        if(sum > sum2) cout <<"Anton"<<endl;
        else if(sum2 > sum) cout << "Danik"<<endl;
        else cout << "Friendship"<<endl;
        return 0;
    }

    B:题意有限定个数的数字2,3,5,6,让你组成256和32,使得它们的和最大

      首先求256的个数,然后再求32的个数

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     long long int a, b, c, d;
     8     long long int sum = 0;
     9     cin >> a >> b >> c >> d;
    10     long long int sa = min(a, min(c, d));
    11     a -= sa;
    12     long long int sb = min(a, b);
    13     sum = sa*256+32*sb;
    14     cout << sum << endl;
    15     return 0;
    16 }


    C:题意需要你生产n瓶药水,你可以用两种方法来减少生产消耗的时间。第一种是改变药水生产的时间,把x改变为a[i],

     第二种是立即生产出c[i]瓶药水。当然这两种方法各会消耗b[i]、c[i]的法力值,你的法力值也是有限的。求最少需要

      多久能生产这n瓶药水。

      枚举第一种方法或者不用,然后能得出剩下的法力值为多少,在第二种方法里用二分即可。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 typedef long long int ll;
     5 
     6 const int MAXN = 2e5+7;
     7 
     8 int a[MAXN], b[MAXN],  c[MAXN],  d[MAXN];
     9 
    10 int main() {
    11     int n, m, k, x, s;
    12     scanf("%d%d%d%d%d", &n, &m, &k, &x, &s);
    13     for(int i = 0; i < m; i++) scanf("%d", &a[i]);
    14     for(int i = 0; i < m; i++) scanf("%d", &b[i]);
    15     for(int i = 0; i < k; i++) scanf("%d", &c[i]);
    16     for(int i = 0; i < k; i++) scanf("%d", &d[i]);
    17 
    18     ll sum;
    19     int ans = upper_bound(d, d+k, s) - d - 1;
    20     if(ans >= 0) sum = 1LL*x*(n-c[ans]);
    21     else sum = 1LL*x*n;
    22 
    23     for(int i = 0; i < m; i++) {
    24         ll now = s - b[i];
    25         if(now >= 0) {
    26             int ans = upper_bound(d, d+k, now)-d-1;
    27             if(ans >= 0) {
    28                 sum = min(sum, 1LL*a[i]*(n-c[ans]));
    29             } else {
    30                 sum = min(sum, 1LL*n*a[i]);
    31             }
    32         }
    33     }
    34     printf("%I64d
    ", sum);
    35     return 0;
    36 }

    D:题意给你一个象棋棋局,里面只有一个白色的国王,和黑色的王后、车、象,让你判断黑棋能否将军。

      在枚举国王周围的八个方向,求出最近的棋子是哪些,看看这些棋能否将军。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 const int INF = 0x7fffffff;
     5 char dir[8];
     6 int dist[8];
     7 int xo, yo, n;
     8 char chess;
     9 int dis(int x, int y){
    10     return max(abs(x-xo), abs(y-yo));
    11 }
    12 int pre(int x, int y){
    13     int sx = abs(x - xo), sy = abs(y - yo);
    14     if(y == yo && x > xo) return 0;
    15     else if(x == xo && y > yo) return 1;
    16     else if(y == yo && x < xo) return 2;
    17     else if(x == xo && y < yo) return 3;
    18     else if(sx == sy && x > xo && y > yo) return 4;
    19     else if(sx == sy && x < xo && y > yo) return 5;
    20     else if(sx == sy && x > xo && y < yo) return 6;
    21     else if(sx == sy && x < xo && y < yo) return 7;
    22     return - 1;
    23 }
    24 int main() {
    25     for(int i = 0; i < 8; i++){
    26         dist[i] = INF;
    27         dir[i] = '?';
    28     }
    29     scanf("%d%d%d", &n, &xo, &yo);
    30     int x, y;
    31     while(n--){
    32         scanf(" %c%d%d", &chess, &x, &y);
    33         int i = pre(x, y);
    34         if(i >= 0) {
    35             int len = dis(x, y);
    36             if(dir[i] == '?' || dist[i] > len){
    37                 dist[i] = len;
    38                 dir[i] = chess;
    39                // printf("XX%d
    ", i);
    40             }
    41         }
    42     }
    43     int flag = 0;
    44     for(int i = 0; i < 4; i++){
    45         if(dir[i] == 'Q' || dir[i] == 'R') flag = 1;
    46     }
    47     for(int i = 4; i < 8; i++){
    48         if(dir[i] == 'Q' || dir[i] == 'B') flag = 1;
    49     }
    50 //    for(int i = 0; i < 8; i++){
    51 //        printf("%c %d %d
    ", dir[i], i, dist[i]);
    52 //    }
    53     printf("%s
    ", flag ? "YES":"NO");
    54     return 0;
    55 }

    E:题意给你tree,节点被染成黑色或白色,你可以将一个节点附近的(一片区域)相同颜色的节点染成另一种颜色。

      问你最少染几次能将这个tree染成一种颜色。

     把一个节点附近的相同颜色缩成一个点,这不影响以后的操作,然后用两边dfs出这个树的直径deep,

      答案为deep/2?从这个直径的中点开始染色然后次数最少,故为deep/2

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 const int MAX_V = 200005;
     5 vector<int>G[MAX_V];
     6 int color[MAX_V];
     7 int deep = -1, p;
     8 void dfs(int u, int fa, int num){
     9     if(num > deep){
    10         p = u;
    11         deep = num;
    12     }
    13     for(int i = 0; i < (int)G[u].size(); i++){
    14         int v = G[u][i];
    15         if(v == fa) continue;
    16         dfs(v, u, num + (color[u]^color[v]));
    17     }
    18 }
    19 int main() {
    20     int n, y, x;
    21     scanf("%d", &n);
    22     for(int i = 1; i <= n; i++) scanf("%d", &color[i]);
    23     for(int i = 0; i < n-1; i++){
    24         scanf("%d%d", &x, &y);
    25         G[x].push_back(y);
    26         G[y].push_back(x);
    27     }
    28     dfs(1, -1, 1);
    29     deep = -1;
    30     dfs(p, -1, 1);
    31     printf("%d
    ", deep/2);
    32     return 0;
    33 }


    F:给你两个数组array b, array c, 让按照规定你求出array a;

       a + b = a&b + a|b;

       能得出a[i] + ∑a = b[i] + c[i] ,求出∑a便可求出a[i]

     推出公式∑b + ∑c = 2*n*∑a 然后验证array a是否能得到array b,c;

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 const int MAXN = 200005;
     5 
     6 int a[MAXN], b[MAXN], c[MAXN], b1[MAXN], c1[MAXN];
     7 int bits[31][MAXN], ans[MAXN];
     8 
     9 int main()
    10 {
    11     int n;
    12     long long int sum = 0;
    13     scanf("%d", &n);
    14     for(int i = 0; i < n; i++) scanf("%d", &b[i]), sum += b[i];
    15     for(int i = 0; i < n; i++) scanf("%d", &c[i]), sum += c[i];
    16     sum /= (2*n);
    17     for(int i = 0; i < n; i++){
    18         a[i] = (b[i]+c[i]-sum)/n;
    19         if(a[i] < 0) {
    20             printf("-1
    ");
    21             exit(0);
    22         }
    23     }
    24     for(int i = 0; i < 31; i++){
    25         for(int j = 0; j < n; j++){
    26             if(a[j]&(1LL<<i)) bits[i][j]++;
    27             else bits[i][j] = 0;
    28         }
    29     }
    30     for(int i = 0; i < 31; i++){
    31         for(int j = 0; j < n; j++) ans[i] += bits[i][j];
    32     }
    33     for(int i = 0; i < n; i++){
    34         for(int j = 0; j < 31; j++){
    35             int bbase = bits[j][i] ? ans[j] : 0;
    36             int cbase = bits[j][i] ? n : ans[j];
    37             b1[i] += bbase << j;
    38             c1[i] += cbase << j;
    39         }
    40         if(b1[i] != b[i] || c1[i] != c[i]) {
    41             printf("-1
    ");
    42             exit(0);
    43         }
    44     }
    45     for(int i = 0; i < n; i++) printf("%d%s", a[i], (i != n-1) ? " ":"
    ");
    46     return 0;
    47 }


     

     

  • 相关阅读:
    JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法
    1.初识Python
    学会 Debug
    如何找出nginx配置文件的所在位置?
    一个技术人,如何做到比别人更突出
    生产环境如何快速跟踪、分析、定位问题-Java
    如何优化代码中大量的if/else,switch/case?
    UML类图几种关系的总结
    DateUtils常用方法
    如何存储和表示数字—二进制(一)
  • 原文地址:https://www.cnblogs.com/cshg/p/6069804.html
Copyright © 2020-2023  润新知