
Codeforces Round #712 (Div. 2) A,B,C,D,E
判断对称性:从字符串两端向中间遍历,检查是否存在对称字符。 插入字符:遇到对称字符前插入‘a’,确保字符串不再对称。
预处理统计:记录每个位置的0和1数量。 逆向检查:从末尾向前遍历,检查当前位置是否需要取反。 确保条件:若当前位置与目标位置不符且前缀0、1数量相同,则取反。
初始检查:字符串长度为偶数,且首尾不为0。 分隔处理:分别处理0和1位置。 配对策略:0配对时,优先配对最近的0;1配对时,优先配对最远的1。
贪心策略:每次选择权重最小的路径。 动态规划:记录每个点的最短路径权重。
发布日期:2021-05-08 16:29:17
浏览次数:18
分类:精选文章
本文共 4959 字,大约阅读时间需要 16 分钟。
代码forces参赛经历与思考
回文字符串问题
题意
给你一个字符串,要求插入一个字符‘a’,使其成为非回文字符串。
提示:如果字符串全为‘a’,则无解,否则只需检查是否有对称字符。思路
代码示例
#includeusing namespace std;bool isS(const string &str) { if (str.empty()) return true; if (str[0] != 'a') return false; for (int i = 0; i < str.size() - 1; ++i) { if (str[i] != str[i+1]) return false; } return true;}int main() { int T; cin >> T; while (T--) { string s; int n = s.size(); bool is_possible = true; for (int i = 0; i < n; ++i) { if (s[n - i - 1] != 'a' && !is_possible) { s.insert(n - i, 'a'); is_possible = false; } } if (is_possible) { cout << "NO\n"; continue; } cout << "YES\n"; for (int i = 0; i < n; ++i) { if (s[n - i - 1] != 'a') { s.insert(n - i, 'a'); break; } } cout << s << endl; } return 0;}
01串转换问题
题意
将给定01串转换为另一个01串,允许每次操作选择前缀取反,且每次操作后01的数量保持不变。
思路
代码示例
#includeusing namespace std;int main() { int T; cin >> T; while (T--) { string s; int n = s.size(); vector cnt0(n + 1, 0), cnt1(n + 1, 0); for (int i = 1; i <= n; ++i) { cnt0[i] = (s[i-1] == '0') ? cnt0[i-1] + 1 : cnt0[i-1]; cnt1[i] = (s[i-1] == '1') ? cnt1[i-1] + 1 : cnt1[i-1]; } string ans1(n, ' '), ans2(n, ' '); bool possible = true; for (int i = n; i >= 0; --i) { if (ans1[i-1] != (s[i-1] == '0' ? '(' : ')')) { if (cnt0[i] != cnt1[i]) possible = false; if (!possible) break; } if (ans2[i-1] != (s[i-1] == '0' ? ')' : '(')) { if (cnt0[i] != cnt1[i]) possible = false; if (!possible) break; } if (possible) { ans1[i-1] = (s[i-1] == '0' ? '(' : ')'); ans2[i-1] = (s[i-1] == '0' ? ')' : '('); } } if (!possible) { if (isS(s)) { cout << "NO\n"; } else { cout << "YES\n"; cout << s << "a\n"; } } else { cout << "YES\n"; for (int i = 0; i < n; ++i) { cout << ans1[i]; } cout << "\n"; for (int i = 0; i < n; ++i) { cout << ans2[i]; } cout << "\n"; } } return 0;}
平衡括号字符串构造
题意
构造两个平衡括号字符串,满足:
- 位置1相同,位置0不同。
- 平衡括号可以通过插入“+”和“1”形成合法表达式。
思路
代码示例
#includeusing namespace std;bool ok() { if (n % 2) return false; vector zero_pos, one_pos; for (int i = 0; i < n; ++i) { if (s[i] == '0') { if (i == 0 || i == n - 1) return false; zero_pos.push_back(i); } else { one_pos.push_back(i); } } if (zero_pos.size() % 2) return false; for (int i = 0; i < zero_pos.size(); i += 2) { ans1[zero_pos[i]] = '('; ans1[zero_pos[i+1]] = ')'; ans2[zero_pos[i]] = ')'; ans2[zero_pos[i+1]] = '('; } int mid = one_pos.size() / 2; for (int i = 0; i < mid; ++i) { ans1[one_pos[i]] = '('; ans1[one_pos[mid - i - 1]] = ')'; ans2[one_pos[i]] = '('; ans2[one_pos[mid - i - 1]] = ')'; } return true;}int main() { int T; cin >> T; while (T--) { int n; string s; string ans1(n, ' '), ans2(n, ' '); if (!ok()) { cout << "NO\n"; } else { cout << "YES\n"; for (int i = 0; i < n; ++i) { cout << ans1[i]; } cout << "\n"; for (int i = 0; i < n; ++i) { cout << ans2[i]; } cout << "\n"; } } return 0;}
城市权重问题
题意
给定n个城市,每个城市有权值a_i或c_i,求从i到j的最短路径权重。
思路
代码示例
#includeusing namespace std;int main() { int n; cin >> n; vector > cities(n); for (int i = 0; i < n; ++i) { int a, c; cin >> a >> c; cities[i] = make_pair(a, c); } vector arr(n); for (int i = 0; i < n; ++i) { int a, c; cin >> a >> c; cities[i] = make_pair(a, c); arr[i] = cities[i].first + cities[i].second; } sort(cities.begin(), cities.end()); ll ans = 0; int maxx = cities[0].first + cities[0].second; for (int i = 1; i < n; ++i) { ans += max(0ll, cities[i].first - maxx); maxx = max(maxx, cities[i].first + cities[i].second); } cout << ans << endl; return 0;}
总结
通过反复练习和梳理思路,逐步掌握了多个Codeforces题目的解法。虽然在比赛中遇到过思路混乱和细节错误的问题,但通过赛后反思和优化,最终实现了正确解答。希望未来能继续保持学习热情,不断提升代码写作和问题解决能力。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年03月23日 22时14分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java开源博客My-Blog(SpringBoot+Docker)系列文章
2019-03-06
程序员视角:鹿晗公布恋情是如何把微博搞炸的?
2019-03-06
【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?
2019-03-06
Linux应用-线程操作
2019-03-06
多态体验,和探索爷爷类指针的多态性
2019-03-06
系统编程-进程间通信-无名管道
2019-03-06
记2020年初对SimpleGUI源码的阅读成果
2019-03-06
C语言实现面向对象方法学的GLib、GObject-初体验
2019-03-06
系统编程-进程-ps命令、进程调度、优先级翻转、进程状态
2019-03-06
为什么我觉得需要熟悉vim使用,难道仅仅是为了耍酷?
2019-03-06
一个支持高网络吞吐量、基于机器性能评分的TCP负载均衡器gobalan
2019-03-06
HDOJ2017_字符串统计
2019-03-06
高等软工第二次作业《需求分析阶段总结》
2019-03-06
404 Note Found 团队会议纪要
2019-03-06
CentOS安装Docker-ce并配置国内镜像
2019-03-06
使用JWT作为Spring Security OAuth2的token存储
2019-03-06
使用Redis作为Spring Security OAuth2的token存储
2019-03-06
【SOLVED】Linux使用sudo到出现输入密码提示延迟时间长
2019-03-06