题目链接: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 }
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 }
J: