UVA - 1610 Party Games (字符串比较)

给你n(n为偶数)个字符串,让你找出一个长度最短且字典序尽量小的字符串,使得一半的字符串小于等于该串,一半的字符串大于该串。

紫薯上说这道题有坑,但其实思路对了就没什么坑。

很明显,只要取夹在中间两个字符串间的最小字符串就行了。可以从小到大枚举字符串的长度,如果该长度下存在满足条件的字符串则返回结果,否则把较小的字符串上对应位的字符加到末尾就行了。

因为想错思路WA了好几次,最后一次WA居然是忘了判断n=0的情况...(为什么我总是完美避开正确答案,QAQ)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1000+10;
 5 int n;
 6 string s[N],s1,s2;
 7
 8 string solve() {
 9     string ss;
10     while(1) {
11         for(char ch=‘A‘; ch<=‘Z‘; ++ch) {
12             string t=ss+ch;
13             if(t>=s1&&t<s2)return t;
14         }
15         ss.push_back(s1[ss.length()]);
16     }
17 }
18
19 int main() {
20     ios::sync_with_stdio(0);
21     while(cin>>n&&n) {
22         for(int i=0; i<n; ++i)cin>>s[i];
23         sort(s,s+n);
24         s1=s[n/2-1],s2=s[n/2];
25         cout<<solve()<<endl;
26     }
27     return 0;
28 }

原文地址:https://www.cnblogs.com/asdfsag/p/10360726.html

时间: 2024-10-12 23:14:54

UVA - 1610 Party Games (字符串比较)的相关文章

Uva 1610 Party Games

Thinking about it: 刚开始思考的时候,脑子里就觉得这道题可能有很多情况,刚开始就因为考虑不周全wa了. 后来换了一种思路,如果不能马上就直接得到答案,就一个一个字母去尝试.这样子就有点类似dfs了,比如 名字排序后排在中间的z字符串是 s1,,s2,那么第i位的字母肯定介于 s1[i] 和 s2[i] 之间,然后先判断在这里填一个字母能否得出答案.这里需注意:不能填了一个字母后就立马搜索下一个情况,因为题目首先要求是最短,所以要在不填下一个字母的情况下,把这个位置可能的字母都填

UVa 489 Hangman Judge(字符串)

 Hangman Judge  In ``Hangman Judge,'' you are to write a program that judges a series of Hangman games. For each game, the answer to the puzzle is given as well as the guesses. Rules are the same as the classic game of hangman, and are given as follo

【uva 1610】Party Games(算法效率--构造 dfs)

题意:有一个N个字符串(N≤1000,N为偶数)的集合,要求找一个长度最短的字符串(可不在集合内)S,使得集合中恰好一半的串小于等于S,另一半大于S.如果有多解,要求输出字典序最小的解. 解法:本来我是想分析情况用if else实现的,但是细节很多,特别容易错.结果果然如此.╮(╯_╰)╭ 那么便看看搜索行不行,由于要求字典序最小,也就是长度尽量小的情况下字符尽量小.而且要集合中恰好一半的串小于等于S,另一半大于S,也就是排序后>=中间靠左边的串且<中间靠右边的串.那么我们可以对排序后的中间的

Party Games UVA - 1610

#include<iostream> #include<string> #include<algorithm> using namespace std; //生成字符串 /* 求出排序后位于中间的两个字符串较小的和较大的分别为s1,s2 s[i]表示字符串s的第i位 对于第1位,显然只需要考虑两个值:s1[1],s1[1]+1 如果单独一位两种方式不能满足,则考虑2位的情况 显然,如果需要考虑第2位,那么第1位应该取s1[1] 对于第i位,如果s1[i]和s2[i]都存

uva 1584 Circular Sequence (字符串处理)

C - Circular Sequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description Some DNA sequences exist in circular forms as in the following figure, which shows a circular sequence ``CGAGTCAGCT", that is,

1610 - Party Games(细节题)

不知道为什么把这道题放在高效里,我这一点也不高效的方法居然也跑了0.016s 我们需要做的很简单,挨个字符的选择,然后先加上这个字符,和所有字符串比较一遍,根据大于它和小于它的字符串个数进行判断就好了 .  注意z这个字符 ,对于某些数据,会TLE的... 没什么意思,直接看代码吧: #include<bits/stdc++.h> using namespace std; const int maxn = 10000 + 5; int n,cnt[maxn]; char ans[35],s[m

UVa 1610 聚会游戏

https://vjudge.net/problem/UVA-1610 题意:输入一个n个字符串的集合D,找一个长度最短的字符串S,使得D中恰好有一半串小于等于S,另一半串大于S. 思路:先拍序,然后选择中间的两个,比较他们就可以了.可以用枚举法来比较. 1 #include<string> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 100

UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)

题意:定义a为一个字符串,a*a表示两个字符相连,即 an+1=a*an ,也就是出现循环了.给定一个字符串,若将其表示成an,问n最大为多少? 思路:如果完全不循环,顶多就是类似于abc1这样咯,即n=1.但是如果循环出现了,比如abab,那就可以表示成(ab)2.还有一点,就是要使得n尽量大,那么当出现abababab时,应该要这么表示(ab)4,而不是(abab)2. 此题用神奇的KMP解决,也就是主要利用next数组.举例说明. 一般出现循环的都会大概是这样的:abcabcabc.而这样

UVa1610 Party Games (字符串)

链接:http://bak2.vjudge.net/problem/UVA-1610 分析:把n个字符串排序,拿中间两个字符串s1和s2比较即可.因为s1<s2,所以可以确定枚举len(s1)个长度肯定能找到解,然后从'A'开始枚举ans的每个位置,首先解要求最短,所以先循环找一个ans>=s1的解,注意保证ans[i]<='Z',判断是否满足条件,满足就是最优解则输出,否则将ans[i]置为s1[i],保证最优解的字典序最小,接着重复上述步骤枚举ans的下一个位置. 1 #includ