SMU Summer 2023 Contest Round 10(ICPC — International Collegiate Programming Contest Asia Regional Contest, Yokohama,2018)
SMU Summer 2023 Contest Round 10(ICPC — International Collegiate Programming Contest Asia Regional Contest, Yokohama)
Problem A
Digits Are Not Just Characters
模拟,注意以下几点,用\(s\)代表比较的字符串,\(str\)代表原字符串:
- s 和 str 一样,排 str 后面.
- 前面部分相同的情况下, s 和 str 谁先碰到数字谁排前面.
- 碰到数字比较谁的数字更小, 谁排前面.
- 剩下就逐字符比较.
- 如果 s 是 str 的前缀, 那 s 应该放前面, 否则放后面.
#include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<string> a(n); string str; cin >> str; for (auto &i : a) cin >> i; auto check = [&](string s) { if (s == str) return false; int i = 0, j = 0; for (; i < s.size() && j < str.size(); i++, j++) { if (isdigit(s[i]) && !isdigit(str[j])) return true; if (isdigit(str[j]) && !isdigit(s[i])) return false; int nums = 0, numstr = 0; while (isdigit(s[i]) && i < s.size()) { nums = nums * 10 + s[i] - '0'; i++; } while (isdigit(str[j]) && j < str.size()) { numstr = numstr * 10 + str[j] - '0'; j++; } if (nums < numstr) return true; else if (nums > numstr) return false; if (s[i] < str[j]) return true; else if (s[i] > str[j]) return false; } if (s.size() < str.size()) return true; return false; }; for (auto i : a) { if (check(i)) cout << "-\n"; else cout << "+\n"; } return 0; }
Problem B(动态规划)
Arithmetic Progressions
用\(dp[i][j]\)的\(i,j\)项表示某个等差数列是以\(a[i],a[j]\)结尾的,然后去二分找到他的下一项找到了就进行转移,最大值随着更新
#include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> a(n); for(auto &i : a) cin >> i; sort(a.begin(), a.end()); vector dp(n,vector<int>(n,2)); int ans = 2; for(int i = 0;i < n;i ++){ for(int j = 0;j < i;j ++){ int p = lower_bound(a.begin(), a.end(),a[j] - a[i] + a[j]) - a.begin(); if(a[p] - a[j] == a[j] - a[i]) dp[i][j] = max(dp[i][j], dp[j][p] + 1); ans = max(ans,dp[i][j]); } } cout << ans << '\n'; return 0; }
Problem C
Emergency Evacuation
如果两个人到出口的时间是相等的,那么其中一个就要多等一个时刻,相应的,如果有多个人到出口时间相等,那么除了第一个人以外,其余人都要往后等\(1,2,3,\dots\)时刻,最终取最后一个人到达出口的时间就是答案了.
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int r,s,p; cin >> r >> s >> p; std::vector<int> v(p); for(int i = 0,x,y;i < p;i ++){ cin >> x >> y; v[i] = r - x + 1; if(y > s) v[i] += y - s; else v[i] += s - y + 1; } sort(v.begin(), v.end()); for(int i = 0;i < p - 1 ;i ++) if(v[i + 1] <= v[i]) v[i + 1] = v[i] + 1; cout << v.back() << '\n'; return 0; }
本文作者:Ke_scholar
本文链接:https://www.cnblogs.com/Kescholar/p/17619751.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步