2020劳动节训练赛
Posted sympa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020劳动节训练赛相关的知识,希望对你有一定的参考价值。
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 ", 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 ", 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劳动节训练赛的主要内容,如果未能解决你的问题,请参考以下文章