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\n", 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\n", 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\n", dir[i], i, dist[i]);
52 //    }
53     printf("%s\n", 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\n", 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\n");
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\n");
42             exit(0);
43         }
44     }
45     for(int i = 0; i < n; i++) printf("%d%s", a[i], (i != n-1) ? " ":"\n");
46     return 0;
47 }

 

 

 


 

 

 

 

 

 

 

posted on 2016-11-16 15:37  disppr  阅读(200)  评论(0编辑  收藏  举报