有点难。
题目连接:https://codeforces.com/contest/1217
A:
想清楚就是一道口算题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ", min(c + 1, max((a + c - b + 1) / 2, 0))); 31 } 32 return 0; 33 }
B:
贪心。按砍完一刀之后改变头的数量来排序。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ", ans); 46 } 47 return 0; 48 }
C:
巧妙的想法没有,看到时限4s就是O(n^2)暴力开搞。要先预处理出所有连续0的位置。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ", ans); 47 } 48 return 0; 49 }