UVA 1610 Party Games
来源:互联网 发布:如何提高mac下载速度 编辑:程序博客网 时间:2024/05/17 05:51
题目的大意是,给出一组名字,然后找到一个字符串S(可以是新的也可以是在这一组名字中的),这个S将这组名字分为两个部分,前一部分的名字小于等于字符串S,后一部分大于字符串S。
解题的思路是,将输入的一组名字names排序,找到中间的(names.size() / 2 - 1和names.size() / 2)两个名字smin和smax。然后初始化要求的字符串S,使其等于smin。
然后从S的最后开始判断,首先将S压入栈olds中,将S的最后一个字符抛去,如果S为空串了,结束循环。否则将倒数第二个字符增大一个(如’A’变为’B’),若倒数第二个字符大于’Z’了,结束循环。否则,继续进行下一个循环。这样就得到的S是尽可能短的,而且一定是字典序最小的。
stack<string> olds;//string栈olds while (!s.empty()) { olds.push(s);//将可能的答案保存下来 s.pop_back();//抛掉最后一个字符 if (!s.size())//为空串,结束循环 break; s[s.size() - 1]++;//将倒数第二个字符增大一个 if (s.compare(smax)>=0)//若不小于smax,结束循环 break; }
然后,从栈顶找到合适的S输出
while (!olds.empty())//从最后得到的s开始找合适的 { s = olds.top(); olds.pop(); if (s[s.size() - 1] <= 'Z') {//最后一个字符不大于Z,这是为了那个出错误的用例 cout << s << endl;//合适的s,输出 break; } }
之前没有保留前几步的S,只输出最后一次的S,结果出错了,搞得我郁闷死了。大家可以用下面这个错误的方法试试下面这个试错的用例,得到的答案是AAAA[,正确的答案是AAAAZB
错误的方法:
string olds = s; while (!s.empty()) { olds = s; s.pop_back(); if (!s.size()) break; s[s.size() - 1]++; if (s.compare(smax)>=0) break; } cout << olds << endl;
试错的用例:
2AAABAAAAZAZ0
下面是完整地代码:
#include <iostream>#include<algorithm>#include<string>#include<string.h>#include<sstream>#include<set>#include<queue>#include<fstream>#include<stack>#include<map>#include<math.h>using namespace std;vector<string> names;bool cmp(const string a, const string b)//自定义比较函数,为sort调用{ return a < b;}int lushi(){ int num = 0; while (cin >> num&&num) { names.clear();//注意每次要清零 while (num--)//输入名字 { string name; cin >> name; names.push_back(name); } sort(names.begin(), names.end(), cmp);//按照从小到大排序 string smin = names[names.size() / 2 - 1], smax = names[names.size() / 2];//找到中间两个名字 string s = smin;//s初始化为smin stack<string> olds;//string栈olds while (!s.empty()) { olds.push(s);//将可能的答案保存下来 s.pop_back();//抛掉最后一个字符 if (!s.size())//为空串,结束循环 break; s[s.size() - 1]++;//将倒数第二个字符增大一个 if (s.compare(smax)>=0)//若不小于smax,结束循环 break; } while (!olds.empty())//从最后得到的s开始找合适的 { s = olds.top(); olds.pop(); if (s[s.size() - 1] <= 'Z') {//最后一个字符不大于Z,这是为了那个出错误的用例 cout << s << endl;//合适的s,输出 break; } } } return 0;}int main(){ streambuf * inbuf = cin.rdbuf((new ifstream("C:\\Users\\yzc\\Desktop\\input.txt"))->rdbuf());//重定向,OJ时将它注释掉 //streambuf * outbuf = cout.rdbuf((new ofstream("C:\\Users\\yzc\\Desktop\\output.txt"))->rdbuf());//重定向,OJ时将它注释掉 //cout << LuShi() << endl; lushi(); system("pause"); return 0;}
阅读全文
0 0
- Uva - 1610 - Party Games
- uva 1610Party Games
- UVA 1610 - Party Games
- UVA 1610 Party Games
- uva 1610 Party Games
- UVA 1610 Party Games
- UVA 1610 Party Games
- UVA - 1610 Party Games 贪心
- UVA 1610(p253)----Party Games
- UVa 1610 - Party Games(细节处理)
- UVa #1610 Party Games (习题8-2)
- UVa:1610 Party Games(字符串处理)
- uva 1610——Party Games
- UVA 1610 Party Games 模拟 有细节
- [UVa 1610] 聚会游戏(Party Games)
- UVA 1610-Party Games(聚会游戏)
- uva 1610 Party Games (贪心+STL字符串)
- Party Games(uva 1610) 卡细节
- 手把手入门神经网络系列(2)_74行代码实现手写数字识别
- Kryo官方文档-中文翻译
- 微信OAuth2网页授权登陆接口
- matlab用穷举法解决问题
- Vasya the Hipster
- UVA 1610 Party Games
- Unity 游戏框架搭建 (十) QFramework v0.0.2小结
- 三维数组倒序
- 机器学习与人工智能资源,等待更新
- 几种IO流读写文件
- 立体匹配---立体匹配过程
- 深入浅出MyBatis-Configuration
- Matrix-Tree定理(1)----矩阵的行列式
- Struts2第九讲学习笔记Action的三种实现方式,两种驱动方式