码迷,mamicode.com
首页 > 其他好文 > 详细

2020劳动节训练赛(2)

时间:2020-05-06 01:05:13      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:space   target   ret   cat   ica   总线   else   代码   turn   

A - Applications  ZOJ - 3705 

题目大意:为大学ACM挑选新队员,计算总分,择优录取。总分=题目总分+比赛+线上赛+性别。

思路:。。。又爱又恨的大模拟,没什么好说的,注意不要让字符读取了空格。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 bool vis[10001] = { 0 };
 4 struct bodys {
 5     char name[1001];
 6     double point;
 7 };
 8 struct teams {
 9     char name[1001];
10     int rank;
11 };
12 bool cmp(bodys b1, bodys b2) {
13     if (b1.point != b2.point)return b1.point > b2.point;
14     else return strcmp(b1.name, b2.name) < 0;
15 }
16 void isprime(int n) {
17     for (int i = 2; i <= n; i++) {
18         for (int j = 2; j * i <= n; j++) {
19             vis[i * j] = true;
20         }
21     }
22 }
23 bool cmpp(int a, int b) {
24     return a > b;
25 }
26 int main()
27 {
28     int t;
29     bodys body[1001];
30     teams team[1001];
31     cin >> t;
32     isprime(10000);
33     while (t--) {
34         int n, m, ti[10001] = { 0 };
35         cin >> n >> m;
36         int r, s, number_ti;
37         cin >> r;
38         for (int i = 0; i < r; i++) { cin >> number_ti; ti[number_ti] = 1; }            //毛毛题
39         cin >> s;
40         for (int i = 0; i < s; i++) { cin >> number_ti; ti[number_ti] = 2; }            //老中医
41         int num_team;
42         cin >> num_team;
43         for (int i = 0; i < num_team; i++) {
44             scanf("%s%d", &team[i].name, &team[i].rank);                                 //战队
45         }
46         //----------------------------------------------------------------------------------------------//
47         for (int i = 0; i < n; i++) {
48             double sum = 0.0;
49             char c, down;
50             int r1, s1, rankp = 0;
51             char team1[101];
52             scanf("%s%s%c%c%d%d", &body[i].name, &team1, &down, &c, &r1, &s1);
53             if (c == F)sum += 33;                 //girl加分
54             //-------------------------------------------------队伍加分--------------------------------------------------//
55             for (int i = 0; i < num_team; i++) {
56                 if (strcmp(team1, team[i].name) == 0) { rankp = team[i].rank; break; }          
57             }
58             if (rankp == 1)sum += 36;
59             else if (rankp == 2)sum += 27;
60             else if (rankp == 3)sum += 18;
61             //----------------------------------------------题目加分------------------------------------------------------//
62             for (int i = 0; i < r1; i++) {
63                 int problem;
64                 cin >> problem;
65                 if (ti[problem] == 1)sum += 2.5;
66                 else if (ti[problem] == 2)sum += 1.5;
67                 else if (vis[problem] == 0)sum += 1;
68                 else sum += 0.3;
69             }
70             //----------------------------------------打rank加分----------------------------------------------------------//
71             int rankk[1001];
72             for (int i = 0; i < s1; i++) {
73                 cin >> rankk[i];
74             }
75             if (s1 >= 3) {
76                 sort(rankk, rankk + s1, cmpp);
77                 sum += max(0.0, (rankk[2] * 1.0 - 1200.0) / 100.0) * 1.5;
78             }
79             body[i].point = sum;
80         }
81         sort(body, body + n, cmp);
82         for (int i = 0; i < m; i++)
83             printf("%s %.3f\n", body[i].name, body[i].point);
84     }
85     return 0;
86 }

 

B - Break Standard Weight   ZOJ - 3706

 题目大意:一个天平两个权值(砝码),可以把其中一个权值(砝码)分成两部分,求最多测出多少种质量。

思路:思维题。暴力枚举每种切割方式,注意不要漏掉摆放方式。

代码(是真的难看):

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int t;
 6     cin >> t;
 7     while (t--) {
 8         int a, b,sum=0,max1=0,q1,q2;
 9         cin >> a >> b;
10         for (int i = 1; i <= a / 2;i++) {
11             sum = 0;
12             int c[201] = { 0 };
13             q1 = i;
14             q2 = a - i;
15             if (c[b] == 0) { c[b] = 1; sum++; }
16             if (c[q1] == 0) { c[q1] = 1; sum++; }
17             if (c[q2] == 0) { c[q2] = 1; sum++; }
18             if (c[q1+q2] == 0) { c[q1 + q2] = 1; sum++; }
19             if (c[q1+b] == 0) { c[q1 + b] = 1; sum++; }
20             if (c[q2+b] == 0) { c[q2 + b] = 1; sum++; }
21             if (c[q1+q2+b] == 0) { c[q1 + q2 + b] = 1; sum++; }
22             if (c[max(q1, q2)-min(q1,q2)] == 0&&q1!=q2) { c[max(q1, q2) - min(q1, q2)] = 1; sum++; }
23             if (c[max(q1, b) - min(q1, b)] == 0 && q1 != b) { c[max(q1, b) - min(q1, b)] = 1; sum++; }
24             if (c[max(q2, b) - min(q2, b)] == 0 && q2 != b) { c[max(q2, b) - min(q2, b)] = 1; sum++; }
25             if (c[max(q1+q2, b) - min(q1 + q2, b)] == 0 && q1 + q2 != b) { c[max(q1 + q2, b) - min(q1 + q2, b)] = 1; sum++; }
26             if (c[max(q1 + b, q2) - min(q1 + b, q2)] == 0 && q1 + b != q2) { c[max(q1 + b, q2) - min(q1 + b, q2)] = 1; sum++; }
27             if (c[max(q2 + b, q1) - min(q2 + b, q1)] == 0 && q2 + b != q1) { c[max(q2 + b, q1) - min(q2 + b, q1)] = 1; sum++; }
28             if (sum > max1)max1 = sum;
29         }
30         //----------------------------------------------------------------------------------------------//
31         for (int i = 1; i <= b / 2; i++) {
32             sum = 0;
33             int c[201] = { 0 };
34             q1 = i;
35             q2 = b - i;
36             if (c[a] == 0) { c[a] = 1; sum++; }
37             if (c[q1] == 0) { c[q1] = 1; sum++; }
38             if (c[q2] == 0) { c[q2] = 1; sum++; }
39             if (c[q1 + q2] == 0) { c[q1 + q2] = 1; sum++; }
40             if (c[q1 + a] == 0) { c[q1 + a] = 1; sum++; }
41             if (c[q2 + a] == 0) { c[q2 + a] = 1; sum++; }
42             if (c[q1 + q2 + a] == 0) { c[q1 + q2 + a] = 1; sum++; }
43             if (c[max(q1, q2) - min(q1, q2)] == 0 && q1 != q2) { c[max(q1, q2) - min(q1, q2)] = 1; sum++; }
44             if (c[max(q1, a) - min(q1, a)] == 0 && q1 != a) { c[max(q1, a) - min(q1, a)] = 1; sum++; }
45             if (c[max(q2, a) - min(q2, a)] == 0 && q2 != a) { c[max(q2, a) - min(q2, a)] = 1; sum++; }
46             if (c[max(q1 + q2, a) - min(q1 + q2, a)] == 0 && q1 + q2 != a) { c[max(q1 + q2, a) - min(q1 + q2, a)] = 1; sum++; }
47             if (c[max(q1 + a, q2) - min(q1 + a, q2)] == 0 && q1 + a != q2) { c[max(q1 + a, q2) - min(q1 + a, q2)] = 1; sum++; }
48             if (c[max(q2 + a, q1) - min(q2 + a, q1)] == 0 && q2 + a != q1) { c[max(q2 + a, q1) - min(q2 + a, q1)] = 1; sum++; }
49             if (sum > max1)max1 = sum;
50         }
51         cout << max1 << endl;
52     }
53     return 0;
54 }

 

D - Density of Power Network  ZOJ - 3708

题目大意:发电站连输电线,A连B和B连A算一条输电线路,求输电线路与总线数的比值。

思路:题目表达太高端,表示读不懂。知道题目想说啥就很简单了,其实就是求无向图的边数,建图后遍历即可。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[501][501], x[501], y[501];
 4 int main()
 5 {
 6     int t,sum=0;
 7     cin >> t;
 8     while (t--) {
 9         sum = 0;
10         memset(a, 0, sizeof(a));
11         memset(x, 0, sizeof(y));
12         memset(x, 0, sizeof(y));
13         int n, m,aa,bb;
14         cin >> n >> m;
15         for (int i = 0; i < m; i++) {
16             cin >> x[i];
17         }
18         for (int i = 0; i < m; i++) {
19             cin >> y[i];
20             a[x[i]][y[i]] = 1;
21             a[y[i]][x[i]] = 1;
22         }
23         for (int i = 1; i <= n; i++) {
24             for (int j = i+1; j <= n; j++) {
25                 if (a[i][j] == 1)sum++;
26             }
27         }
28         printf("%.3f\n", sum * 1.0 / n);
29     }
30     return 0;
31 }

 

F - Friends   ZOJ - 3710 

题目大意:有一个国家,里面的人喜欢交朋友。如果2个人有不少于k个共同的朋友,那么他们也会变成朋友,问他们建立了多少新友谊。

思路:变形的传递闭包。啊这题看起来好难呀……什么?可以暴力?那没事了。遍历看有没有新关系形成,有的话从头再来~

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int t;
 6     cin >> t;
 7     while (t--) {
 8         int n, m, k, a[101][101] = {0},c,d,ans=0,ff=0;
 9         cin >> n >> m >> k;
10         for (int i = 0; i < m; i++) {
11             cin >> c >> d;
12             a[c][d] = 1;
13             a[d][c] = 1;
14         }
15         while (1) {
16             ff = 0;
17             for (int i = 0; i < n; i++) {
18                 for (int j = i+1; j < n; j++) {
19                     if (!a[i][j]) {
20                         int npy = 0;
21                         for (int w = 0; w < n; w++) {
22                             if (a[i][w] == 1 && a[j][w] == 1 && i != w && j != w) {
23                                 npy++;
24                             }
25                         }
26                         if (npy >= k) {
27                             a[i][j] = 1;
28                             a[j][i] = 1;
29                             ff = 1;
30                             ans++;
31                         }
32                     }
33                 }
34             }
35             if (!ff)break;
36         }
37         cout << ans << endl;
38     }
39     return 0;
40 }

 

H - Hard to Play  ZOJ - 3712 

题目大意:音游打combo,三种得分300,100,50;告诉你每种得分多少,假设全连(是个大佬),问最大和最少得分。

思路:贪心。因为combo越多得分倍率越高嘛,想得高分当然要把高分放后面啦,低分同理。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int t;
 6     cin >> t;
 7     while (t--) {
 8         long long a, b, c, max1=0, min1=0;
 9         cin >> a >> b >> c;
10         int ans = 0;
11         for (int i = 0; i < a; i++) {
12             min1 += 300 * (ans * 2 + 1);
13             ans++;
14         }
15         for (int i = 0; i < b; i++) {
16             min1 += 100 * (ans * 2 + 1);
17             ans++;
18         }
19         for (int i = 0; i < c; i++) {
20             min1 += 50 * (ans * 2 + 1);
21             ans++;
22         }
23         ans = 0;
24         for (int i = 0; i < c; i++) {
25             max1 += 50 * (ans * 2 + 1);
26             ans++;
27         }
28         for (int i = 0; i < b; i++) {
29             max1 += 100 * (ans * 2 + 1);
30             ans++;
31         }
32         for (int i = 0; i < a; i++) {
33             max1 += 300 * (ans * 2 + 1);
34             ans++;
35         }
36         cout << min1 << " " << max1 << endl;
37     }
38     return 0;
39 }

 

J - Java Beans   ZOJ - 3714

题目大意:N个孩子围成圈,每人手里都有豆子,问从M个连续孩子手里最多拿多少豆。

思路:暴力枚举,别忘了取模。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[201];
 4 int main()
 5 {
 6     int t;
 7     cin >> t;
 8     while (t--) {
 9         int m, n,sum=0,max1=0;
10         cin >> n >> m;
11         for (int i = 0; i < n; i++)
12             cin >> a[i];
13         for (int i = 0; i < n; i++)
14         {
15             for (int j = i; j < m + i; j++)
16                 max1 += a[j % n];
17             if (sum < max1) {
18                 sum = max1;
19             }
20             max1 = 0;
21         }
22             cout << sum << endl;
23     }
24     return 0;
25 }

 

总是觉得时间不够用……在家中还是会怠惰的

2020劳动节训练赛(2)

标签:space   target   ret   cat   ica   总线   else   代码   turn   

原文地址:https://www.cnblogs.com/Sympa/p/12833793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!