2019牛客暑期多校训练营 第六场

题目链接:https://ac.nowcoder.com/acm/contest/886#question


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 const int maxn = 2e3 + 10;
22 
23 int main() {
24     scanf("%d", &t);
25     for (int ca = 1; ca <= t; ca++) {
26         printf("Case #%d: ", ca);
27         char s[maxn], t[27];
28         scanf("%s", s + 1);
29         scanf("%s", t + 1);
30         map<char, int>m; m.clear();
31         int len = strlen(s + 1), dry = 0, wet = 0, harm = 0;
32         for (int i = 1; i <= len; i++)
33                 if (!m.count(s[i])) m[s[i]] = 1; else m[s[i]]++;
34         for (int i = 1; i <= 26; i++) {
35             if (t[i] == 'd') dry += m[(char)(i + 'a' - 1)];
36             else if (t[i] == 'w') wet += m[(char)(i + 'a' - 1)];
37             else if (t[i] == 'h') harm += m[(char)(i + 'a' - 1)];
38         }
39         if (harm * 4 >= len) puts("Harmful");
40         else if (harm * 10 <= len) puts("Recyclable");
41         else if (!wet || dry / wet >= 2) puts("Dry");
42         else puts("Wet");
43     }
44     return 0;
45 }
View Code

B:

一开始认为可以直接找最长的最靠后的0串进行压缩,后来发现有个大坑:首尾和中间同样长度的0对答案贡献不一样大。在中间的连续0压缩后能少1长度。

可以直接枚举删去哪一段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 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 = 10;
21 int a[maxn];
22 
23 int main() {
24     int t; scanf("%d", &t);
25     for (int caseNum = 1; caseNum <= t; caseNum++) {
26         int startPos = 0, maxLen = 0, currLen = 0;
27         for (int i = 1; i <= 8; i++) {
28             a[i] = 0;
29             for (int j = 1; j <= 16; j++) {
30                 int x; scanf("%1d", &x);
31                 a[i] = a[i] * 2 + x;
32             }
33             if (!a[i]) currLen++; // currLen记录当前连续的全0段个数
34             else { // 如果遇到全1段,维护答案
35                 if (currLen >= maxLen && currLen > 1) {
36                     startPos = i - currLen;
37                     maxLen = currLen;
38                 }
39                 currLen = 0;
40             }
41             if (i == 8 && currLen > 1) { // 如果全0段延续到末尾
42                 if (currLen > maxLen) // 如果是最长,照常处理
43                     startPos = i - currLen + 1, maxLen = currLen;
44                 if (currLen == maxLen && startPos == 1) // 否则判断开头有长度跟最大长度相同的全0段
45                     startPos = i - currLen + 1;
46             }
47         }
48         printf("Case #%d: ", caseNum);
49         if (startPos == 1) printf(":");
50         for (int i = 1; i <= 8; i++) {
51             if (i == startPos) {
52                 printf(":"); i += maxLen;
53             }
54             if (i > 8) puts("");
55             else printf("%x%c", a[i], ":\n"[i == 8]);
56         }
57     }
58     return 0;
59 }
View Code

J:

猜你喜欢

转载自www.cnblogs.com/JHSeng/p/11296837.html
今日推荐