2020劳动节训练赛(1)
A - Trick or Treat Gym - 102470A
题目大意:给n个点,求所有点到x轴哪一点的和最小。
思路:记录所有点中x坐标最靠左和最靠右的两个点,用它们的x坐标当作边界,三分答案。注意开long double,不然会丢失精度。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 struct point { 5 long double x, y; 6 }p[50001]; 7 bool cmp(point p1, point p2) { 8 return p1.x < p2.x; 9 } 10 long double juli(long double x, long double y) { 11 long double l = 0; 12 for (int i = 0; i < n; i++) { 13 l = max(sqrt((p[i].x - x) * (p[i].x - x) + (p[i].y - y) * (p[i].y - y)), l); 14 } 15 return l; 16 } 17 int main() 18 { 19 while (cin >> n) { 20 if (n == 0)break; 21 long double x, y; 22 for (int i = 0; i < n; i++) { 23 scanf("%Lf%Lf", &x, &y); 24 p[i].x = x; 25 p[i].y = y; 26 } 27 sort(p, p + n, cmp); //对所有点排序求边界 28 long double l = p[0].x, r = p[n - 1].x, mid1, mid2; 29 while (l + 0.000000001 < r) { //消除精度误差 30 mid1 = (l + l + r) / 3; //三分答案 31 mid2 = (r + r + l) / 3; 32 if (juli(mid1, 0) < juli(mid2, 0)) 33 r = mid2; 34 else 35 l = mid1; 36 } 37 printf("%.9Lf %.9Lf\n", l, juli(l, 0)); //long double输出用Lf 38 } 39 return 0; 40 }
B - Working at the Restaurant Gym - 102470B
题目大意:汤姆和npy约会没带钱!只能打工递盘子。递盘子三个步骤:1.接过盘子放到桌上,桌上有两个放盘子的空间。2.移动盘子,把一堆盘子移动到另一堆上。注意:要求拿出的盘子的顺序和进来的顺序一致。3.把盘子送到洗碗机。
思路:模拟。接过盘子放到2堆上,当1堆为空时,要将2堆盘子移动到1堆,才能保证顺序不会错。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 ios::sync_with_stdio(false); 6 int n,flag=0; 7 while (cin >> n) { 8 int sum = 0, m; 9 if (n == 0)break; 10 if(flag!=0) 11 cout << endl; 12 flag = 1; 13 int p1=0, p2=0; 14 char s[10]; 15 for(int i=0;i<n;i++){ 16 cin >> s >> m; 17 if (s[0] == 'D') { 18 sum += m; 19 p2 += m; 20 cout << "DROP 2 " << m << endl; 21 } 22 else { 23 if (p1 >= m) { 24 cout << "TAKE 1 " << m << endl; 25 p1 -= m; 26 m = 0; 27 } 28 else { 29 if (p1 > 0) { 30 cout << "TAKE 1 " << p1 << endl; 31 m -= p1; 32 p1 = 0; 33 } 34 } 35 if (m > 0) { 36 cout << "MOVE 2->1 " << sum << endl; 37 p1 += sum; 38 cout << "TAKE 1 " << m << endl; 39 p1 -= m; 40 m = 0; 41 sum = 0; 42 } 43 } 44 } 45 } 46 return 0; 47 }
F - Happy Telephones Gym - 102470I
题目大意:监听,询问某个时段有多少通话同时进行。
思路:签到题(阅读理解题)。记录每个通话始末时间,暴力查找即可。
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[10001], b[10001]; 4 int main() 5 { 6 ios::sync_with_stdio(false); 7 int n, m; 8 while (cin >> n >> m) { 9 if (n == 0 && m == 0)break; 10 int s, e, f, t,ans=0; 11 for (int i = 0; i < n; i++) { 12 cin >> s >> e >> f >> t; 13 a[ans] = f; 14 b[ans] = f+t-1; 15 ans++; 16 } 17 int k, l; 18 for (int i = 0; i < m; i++) { 19 cin >> k >> l; 20 int u = 0; 21 for (int j = 0; j < n; j++) { 22 if (k<=b[j]&&k+l-1>=a[j]) 23 u++; 24 } 25 cout << u << endl; 26 } 27 } 28 return 0; 29 }

浙公网安备 33010602011771号