Codeforces Edu Round 72 (Rated for Div. 2)

时间:2019-09-06
本文章向大家介绍Codeforces Edu Round 72 (Rated for Div. 2),主要包括Codeforces Edu Round 72 (Rated for Div. 2)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

有点难。

题目连接:https://codeforces.com/contest/1217


A:

想清楚就是一道口算题。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 int t;
21 
22 int main() {
23     scanf("%d", &t);
24     while (t--) {
25         int a, b, c; scanf("%d%d%d", &a, &b, &c);
26         if (!c) {
27             a > b ? puts("1") : puts("0");
28         continue;
29         }
30         printf("%d\n", min(c + 1, max((a + c - b + 1) / 2, 0)));
31     }
32     return 0;
33 }
View Code

B:

贪心。按砍完一刀之后改变头的数量来排序。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 const int maxn = 200;
21 pair<int, int>cut[maxn];
22 
23 int main() {
24     int t; scanf("%d", &t);
25     while (t--) {
26         int n, head, maxx = 0;
27         scanf("%d%d", &n, &head);
28         rep1(i, 1, n) {
29             int a, b; scanf("%d%d", &a, &b);
30             maxx = max(a, maxx);
31             cut[i].first = a - b, cut[i].second = a;
32         }
33         head -= maxx;
34         sort(cut + 1, cut + 1 + n, greater<pair<int, int>>());
35         if (head <= 0) {
36             puts("1");
37             continue;
38         }
39         if (cut[1].first <= 0) {
40             puts("-1");
41             continue;
42         }
43         int ans = head / cut[1].first + 1;
44         if (head % cut[1].first) ans++;
45         printf("%d\n", ans);
46     }
47     return 0;
48 }
View Code

C:

巧妙的想法没有,看到时限4s就是O(n^2)暴力开搞。要先预处理出所有连续0的位置。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define epre 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 const int maxn = 2e5 + 10;
21 int t, pre[maxn];
22 char s[maxn];
23 
24 int main() {
25     scanf("%d", &t);
26     while (t--) {
27         scanf("%s", s + 1);
28         int n = strlen(s + 1);
29         ll ans = 0;
30         rep1(i, 1, n) {
31             if (s[i] == '1') pre[i] = -1;
32             else pre[i] = s[i - 1] == '0' ? pre[i - 1] : i;
33         }
34         rep1(r, 1, n) {
35             ll curr = 0;
36             for (int l = r; l >= 1; l--)
37                 if (s[l] == '1') {
38                     if (r - l >= 20) break;
39                     curr += (1 << (r - l));
40                     if (r - l + 1 == curr) ans++;
41                 } else {
42                     if (r + 1 - curr >= pre[l] && r + 1 - curr <= l) ans++;
43                     l = pre[l];
44                 }
45         }
46         printf("%lld\n", ans);
47     }
48     return 0;
49 }
View Code

原文地址:https://www.cnblogs.com/JHSeng/p/11474948.html