A. Division?
条件判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<bits/stdc++.h> void solve() { int x; std::cin >> x; if(x <= 1399) { std::cout << "Division 4\n"; } else if(x <= 1599) { std::cout << "Division 3\n"; } else if(x <= 1899) { std::cout << "Division 2\n"; } else std::cout << "Division 1\n"; } int main() { }
|
B. Triple
判断有没有一个数字出现至少三次
最优时间复杂度为 ,使用一个桶,加一个数字就判断桶里有几个
有点懒,直接 sort
了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<bits/stdc++.h> void solve() { int n; std::cin >> n; std::vector<int> a(n); for(int i = 0; i < n; i++) std::cin >> a[i]; sort(a.begin(), a.end()); for(int i = 1; i + 1 < n; i++) if(a[i - 1] == a[i] && a[i] == a[i + 1]) { std::cout << a[i] << '\n'; return ; } std::cout << -1 << '\n'; } int main() { }
|
C. Odd/Even Increments
判断能否通过一些操作让所有数字奇偶性相同
因为操作只能让奇数位置或偶数位置的奇偶性都改变
直接判断奇数位置或偶数位置有没有奇数偶数同时存在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<bits/stdc++.h> void solve() { int n; std::cin >> n; std::vector<int> a(n); for(int i = 0; i < n; i++) std::cin >> a[i]; bool flaga = false,flagb = false; for(int i = 0; i < n; i += 2) { if(a[i] & 1) flaga = true; else flagb = true; } if(flaga && flagb) { std::cout << "NO" << '\n'; return; } flaga = false; flagb = false; for(int i = 1; i < n; i += 2) { if(a[i] & 1) flaga = true; else flagb = true; } if(flaga && flagb) { std::cout << "NO" << '\n'; return; } std::cout << "YES" << '\n'; } int main() { }
|
D. Colorful Stamp
以 为分割点,对每一段分别判断
开始以为是判断边界两个点不同色,后面发现只要存在相邻位置不同色就有解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include<bits/stdc++.h> bool check(std::string s) { int len = s.length(); if(len == 0) return true; if(len == 1) return false; for(int i = 1; i < len; i++) if(s[i - 1] != s[i]) return true; return false; } void solve() { int n; std::cin >> n; std::string s; std::cin >> s; int pos = 0, len = 0; while(pos < n) { while(pos + len < n && s[pos + len] != 'W') len ++; bool flag = check(s.substr(pos,len)); if(flag == false) { std::cout << "NO\n"; return; } pos = pos + len + 1; len = 0; } std::cout << "YES\n"; } int main() { }
|
E. 2-Letter Strings
简单统计一下,注意开 long long
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include<bits/stdc++.h> void solve() { int n; std::cin >> n; long long ans = 0; std::vector<std::vector<int>> a(26,std::vector<int> (27)),b(26,std::vector<int> (27)); for(int i = 0; i < n; i++) { std::string s; std::cin >> s; int x,y; x = s[0] - 'a'; y = s[1] - 'a'; a[x][0]++;a[x][y + 1]++; ans += a[x][0] - a[x][y + 1]; b[y][0]++;b[y][x + 1]++; ans += b[y][0] - b[y][x + 1]; } std::cout << ans << '\n'; } int main() { }
|
F. Eating Candies
在给定序列中找到一个前缀和后缀,让他们的值相等,且长度和最大
发现前缀和单调递增,考虑用二分的方法
枚举后缀,二分前缀,判断,刷新答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include<bits/stdc++.h> void solve() { int n; std::cin >> n; std::vector<int> a(n + 1); std::map<long long,int> map; std::vector<long long> prefix(n + 1); for(int i = 1; i <= n; i++) { std::cin >> a[i]; prefix[i] = prefix[i - 1] + a[i]; map[prefix[i]] = i; } int ans = 0; for(int i = n - 1; i >= 1; i--) { long long val = *lower_bound(prefix.begin() + 1,prefix.end(), prefix[n] - prefix[i]); if(val != prefix[n] - prefix[i]) continue; int pos = map[val]; if(pos > i) continue; ans = std::max(ans,pos + n - i); } std::cout << ans << '\n'; } int main() { }
|
G. Fall Down
简单模拟题,有点担心 1e7
爆时间复杂度,优化了一下下落位置,复杂度 1e6
级别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include<bits/stdc++.h> void solve() { int n,m; std::cin >> n >> m; std::vector<std::string> s(n + 1); for(int i = 1; i <= n; i++) { std::cin >> s[i]; } for(int i = 0; i < m; i++) { int las = n; for(int j = n; j >= 1; j--) { if(s[j][i] == 'o') las = j - 1; if(s[j][i] == '*') { std::swap(s[j][i],s[las][i]); las--; } } } for(int i = 1; i <= n; i++) { std::cout << s[i] << '\n'; } } int main() { }
|
H. Maximal AND
简单贪心,从高位到低位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<bits/stdc++.h> void solve() { int n,k; std::cin >> n >> k; std::vector<int> s(31); for(int i = 0; i < n; i++) { int x; std::cin >> x; for(int j = 0; j <= 30; j++) if(x & (1 << j)) s[j]++; } int ans = 0; for(int i = 30; i >= 0; i--) { if(s[i] + k >= n) { ans += (1 << i); k = k - (n - s[i]); } } std::cout << ans << '\n'; } int main() { }
|
总结 & 吐槽
参与,一个小时 挺爽的,虽然大佬们都是二十分钟
为什么 不加分啊(恼