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 }

 

posted @ 2020-05-04 22:45  Sympa  阅读(158)  评论(0)    收藏  举报