UVa:1610 Party Games(字符串处理)
2015-08-22 16:11
441 查看
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=845&page=show_problem&problem=4485
题意:输入一个n(2
≤n≤1000,n是偶数)个字符串的集合D,找一个长度最短的字符串(不一定在D中出现)S,使得D中恰好一半串小于等于S,另一半串大于S。如果有多解,输出字典序最小的解。例如,对于{JOSEPHINE,JERRY},输出JF;对于{FRED,FREDDIE}输出FRED。(本段摘自《算法竞赛入门经典(第2版)》)
分析:基本想法是是对字符串按字典序排序,然后只需处理中间的两个字符串就可以了。主要是对细节的处理要注意。
代码:
题意:输入一个n(2
≤n≤1000,n是偶数)个字符串的集合D,找一个长度最短的字符串(不一定在D中出现)S,使得D中恰好一半串小于等于S,另一半串大于S。如果有多解,输出字典序最小的解。例如,对于{JOSEPHINE,JERRY},输出JF;对于{FRED,FREDDIE}输出FRED。(本段摘自《算法竞赛入门经典(第2版)》)
分析:基本想法是是对字符串按字典序排序,然后只需处理中间的两个字符串就可以了。主要是对细节的处理要注意。
代码:
#include <iostream> #include <fstream> #include <cstring> #include <vector> #include <queue> #include <cmath> #include <algorithm> #include <set> #include <string> using namespace std; const int maxn = 1005; int n, l, l1, l2; string s, s1, s2, tmp; string a[maxn]; int main() { while (~scanf("%d", &n), n) { s = ""; for (int i = 0; i < n; ++i) cin >> a[i]; sort(a, a + n); s1 = a[n / 2 - 1]; s2 = a[n / 2]; l1 = s1.size(); l2 = s2.size(); l = min(l1, l2); for (int i = 0; i < l; ++i) if (s1[i] == s2[i]) s += s1[i]; else { tmp = s + (char)(s1[i] + 1); if (tmp == s2) { s += s1[i++]; while (i < l1 - 1 && s1[i] == 'Z') s += s1[i++]; if (i < l1 - 1) s += (char)(s1[i] + 1); else s = s1; } else { if (tmp.size() == l1) s = s1; else s = tmp; } break; } cout << s << '\n'; } return 0; }
相关文章推荐
- C++builder的文件读写操作总结(3)
- Java进阶06 容器
- 揭开私有继承的面纱
- 线段树维护区间的和和单点更新-HDU1166-敌兵布阵
- hdu 1698 Just a Hook(线段树成段更新+延迟标记).
- [python] 命令行参数
- CF268C. Beautiful Sets of Points
- 浏览器的重绘、回流及网页优化
- HDU1556Color the ball
- jquery+css实现的红色线条横向二级菜单效果
- The one who can give anything you want is only yourself. The rating is the only you should pursue.
- CODE COMPLETE 2e Chapter 7
- Jenkins 的安装与简单使用
- Python TCP服务器
- 2014——我的求职(两)
- PPT是什么
- oc图片压缩与Base46编码
- pat----打印沙漏
- hdu4737区间统计
- tcpdump抓包二进制tcp协议详细分析