Codeforces Round #280 (Div. 2)

A - Vanya and Cubes

代码:

 1 #include <bits/stdc++.h>
 2 #define pb push_back
 3 #define mp make_pair
 4 #define esp 1e-12
 5 #define lowbit(x) ((x)&(-x))
 6 #define lson   l, m, rt<<1
 7 #define rson   m+1, r, rt<<1|1
 8 #define sz(x) ((int)((x).size()))
 9 #define pb push_back
10 #define pf(x) ((x)*(x))
11 
12 #define pi acos(-1.0)
13 
14 #define in freopen("solve_in.txt", "r", stdin);
15 #define out freopen("solve_out.txt", "w", stdout);
16 
17 #define bug(x) printf("Line : %u >>>>>>
", (x));
18 #define inf 0x0f0f0f0f
19 using namespace std;
20 typedef long long LL;
21 typedef pair<int, int> PII;
22 const int maxn = (int)1e4 + 100;
23 LL f[maxn];
24 int m;
25 void pre(){
26     LL sum = 0;
27     m = 0;
28     for(int i = 1; f[i] < (maxn); sum += i, i++){
29         f[i] = f[i-1] + sum + i;
30         m++;
31     }
32 }
33 int main(){
34   
35     pre();
36     int n;
37     scanf("%d", &n);
38     int ans = upper_bound(f+1, f+m+1, n)-f;
39     cout << ans - 1 << endl;
40 //    cout << f[5];
41     return 0;
42 }
View Code

B - Vanya and Lanterns

分析:

比较两端的灯向两边的照射长度,然后其他两个相邻灯之间距离的一半,取最大值。

代码:

 1 #include <bits/stdc++.h>
 2 #define pb push_back
 3 #define mp make_pair
 4 #define esp 1e-12
 5 #define lowbit(x) ((x)&(-x))
 6 #define lson   l, m, rt<<1
 7 #define rson   m+1, r, rt<<1|1
 8 #define sz(x) ((int)((x).size()))
 9 #define pb push_back
10 #define pf(x) ((x)*(x))
11 
12 #define pi acos(-1.0)
13 
14 #define in freopen("solve_in.txt", "r", stdin);
15 #define out freopen("solve_out.txt", "w", stdout);
16 
17 #define bug(x) printf("Line : %u >>>>>>
", (x));
18 #define inf 0x0f0f0f0f
19 using namespace std;
20 typedef long long LL;
21 typedef pair<int, int> PII;
22 const int maxn = 1111;
23 int a[maxn];
24 
25 int main(){
26 //    in
27     int n, l;
28     scanf("%d%d", &n, &l);
29     for(int i = 1; i <= n; i++)
30         scanf("%d", a+i);
31     sort(a+1, a+n+1);
32     n = unique(a+1, a+n+1)-a-1;
33     double ans = max(a[1], l-a[n]);
34     for(int i = 1; i < n; i++)
35         ans = max(ans, (a[i+1]-a[i])/2.0);
36     printf("%.12f
", ans);
37     return 0;
38 }
View Code

C - Vanya and Exams

分析:考虑剩下还需要多少分。按bi从小到大选取。

代码:

 1 #include <bits/stdc++.h>
 2 #define pb push_back
 3 #define mp make_pair
 4 #define esp 1e-12
 5 #define lowbit(x) ((x)&(-x))
 6 #define lson   l, m, rt<<1
 7 #define rson   m+1, r, rt<<1|1
 8 #define sz(x) ((int)((x).size()))
 9 #define pb push_back
10 #define pf(x) ((x)*(x))
11 
12 #define pi acos(-1.0)
13 
14 #define in freopen("solve_in.txt", "r", stdin);
15 #define out freopen("solve_out.txt", "w", stdout);
16 
17 #define bug(x) printf("Line : %u >>>>>>
", (x));
18 #define inf 0x0f0f0f0f
19 using namespace std;
20 typedef long long LL;
21 typedef pair<int, int> PII;
22 const int maxn = (int)1e5 + 100;
23 
24 int a[maxn], b[maxn];
25 struct Node {
26     int a, b;
27     bool operator < (const Node &o)const {
28         return b < o.b;
29     }
30 } x[maxn];
31 
32 int main() {
33 //    in
34     int n, r, avg;
35     scanf("%d%d%d", &n, &r, &avg);
36     LL tot, sum = 0, ans = 0;
37     for(int i = 0; i < n; i++) {
38         scanf("%d%d", &x[i].a, &x[i].b);
39         sum += x[i].a;
40     }
41     sort(x, x+n);
42     sum = (LL)avg*n-sum;
43     if(sum <= 0)
44         puts("0");
45     else {
46         for(int i = 0; i < n; i++) {
47             if(r-x[i].a <= sum) {
48                 ans += (LL)x[i].b*(r-x[i].a);
49                 sum -= (r-x[i].a);
50             } else {
51                 ans += (LL)sum*x[i].b;
52                 break;
53             }
54         }
55         printf("%I64d
", ans);
56     }
57     return 0;
58 }
View Code

D - Vanya and Computer Game

分析:二分法。找到最大的一个数m使得m/y+m/x < n,那么然后m+1能否整除y,x。

解释是,每次hit增加一个一定是y,x中至少一个整除m,那么看谁能整除,最后一次hit就是谁贡献的。

代码:

 1 #include <bits/stdc++.h>
 2 #define pb push_back
 3 #define mp make_pair
 4 #define esp 1e-12
 5 #define lowbit(x) ((x)&(-x))
 6 #define lson   l, m, rt<<1
 7 #define rson   m+1, r, rt<<1|1
 8 #define sz(x) ((int)((x).size()))
 9 #define pb push_back
10 #define pf(x) ((x)*(x))
11 
12 #define pi acos(-1.0)
13 
14 #define in freopen("solve_in.txt", "r", stdin);
15 #define out freopen("solve_out.txt", "w", stdout);
16 
17 #define bug(x) printf("Line : %u >>>>>>
", (x));
18 #define inf 0x0f0f0f0f
19 using namespace std;
20 typedef long long LL;
21 typedef pair<int, int> PII;
22 int main() {
23 //    in
24     int x, y, n;
25     scanf("%d%d%d", &n, &x, &y);
26     swap(x, y);
27     for(int i = 1; i <= n; i++) {
28         int m;
29         scanf("%d", &m);
30 
31         LL l = 0, r = (LL)1e18;
32         LL mid;
33         while(1) {
34             mid = (l+r)>>1;
35             if(mid/x+mid/y < m) {
36                 if((mid+1)/x + (mid+1)/y >= m)
37                     break;
38                 else l = mid+1;
39             } else r = mid-1;
40         }
41         l = mid;
42         if((l+1)%x == 0 && (l+1)%y == 0)
43             puts("Both");
44         else if((l+1)%x == 0)
45             puts("Vanya");
46         else puts("Vova");
47     }
48     return 0;
49 }
View Code

E - Vanya and Field

分析:gcd(dx, n) = gcd(dy, n)知道从任意一点出发访问,一定会停止在原点,也就是原点是第一个重复点,而且总共访问n个点,这n个点的x,y坐标是能够分别覆盖0,1, n-1的,有了这个的话,我们可以假定从原点出发,到达每一行x时,相应的y的坐标,那么出发点相对原点向上移动一个单位,到达每一行的时y坐标也向上移动一个坐标。然后对于每个位置的苹果树,算出可以访问该点的(x = 0, y)的坐标,,最后看哪个y坐标上出发访问的点最多,输出0 y。

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = (int)1e6 + 100;
 4 int pos[maxn], ans[maxn];
 5 
 6 
 7 int main(){
 8     int n, m, dx, dy;
 9     scanf("%d%d%d%d", &n, &m, &dx, &dy);
10     if(n == 1){
11         for(int i = 0; i < m; i++){
12             int x, y;
13             scanf("%d%d", &x, &y);
14         }
15         puts("0 0");
16     }
17     else{
18     int sx = 0, sy = 0;
19     while(1){
20         pos[sx] = sy;
21         sx = (sx+dx)%n;
22         sy = (sy+dy)%n;
23         if(sx == 0 && sy == 0) break;
24         }
25       for(int i = 0; i < m; i++){
26         int x, y;
27         scanf("%d%d", &x, &y);
28         ans[(y-pos[x]+n)%n]++;
29         }
30         int t = max_element(ans, ans+n)-ans;
31         cout << 0 << ' ' << t << endl;
32     }
33     return 0;
34 }
View Code
原文地址:https://www.cnblogs.com/rootial/p/4137889.html