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]都存在,只要类比以上方法即可
如果s1.length>s2.length
试验可得用一般的方法即可
如果s1.length<s2.length
如果计算到s1.length位仍未得出结果,那么答案就是s1
*/
//曾经出过的bug:忽略了s1[i]+1超出了字母范围(A到Z)的情况,此时应舍去
string s[1000];
string t1,t2,s1,s2;
int n;
int main()
{
	int i;
	cin>>n;
	while(n!=0)
	{
		t1="";t2="";
		for(i=0;i<n;i++)
			cin>>s[i];
		sort(s,s+n);
		s1=s[(n/2)-1];
		s2=s[n/2];
		for(i=0;i<s1.length();i++)
		{
			t2=t1+s1[i];
			if(t2>=s1&&t2<s2)
			{
				cout<<t2<<‘\n‘;
				goto haha;
			}
			if(s1[i]+1<=‘Z‘)
			{
				t2=t1+(char)(s1[i]+1);
				if(t2>=s1&&t2<s2)
				{
					cout<<t2<<‘\n‘;
					goto haha;
				}
			}
			t1+=s1[i];
		}
		if(s1.length()<s2.length())
		{
			cout<<s1<<‘\n‘;
		}
		haha:
		cin>>n;
	}
	return 0;
}

  

时间: 2024-10-09 23:32:23

Party Games UVA - 1610的相关文章

Uva 1610 Party Games

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

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

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

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

给你n(n为偶数)个字符串,让你找出一个长度最短且字典序尽量小的字符串,使得一半的字符串小于等于该串,一半的字符串大于该串. 紫薯上说这道题有坑,但其实思路对了就没什么坑. 很明显,只要取夹在中间两个字符串间的最小字符串就行了.可以从小到大枚举字符串的长度,如果该长度下存在满足条件的字符串则返回结果,否则把较小的字符串上对应位的字符加到末尾就行了. 因为想错思路WA了好几次,最后一次WA居然是忘了判断n=0的情况...(为什么我总是完美避开正确答案,QAQ) 1 #include<bits/st

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 11927 - Games Are Important(组合游戏+记忆化)

题目链接:uva 11927 - Games Are Important 题目大意:给出一张无环有向图,并给出每个节点上的石子数,每次操作可以选择一个石子,向下一个节点移动.两人轮流操作,直到不能操作为失败者. 解题思路:有了图之后,用记忆化的方式处理出每个节点的SG值,取所有石子数为奇数的节点的Nim和. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; con

UVA 11927 - Games Are Important(sg函数)

UVA 11927 - Games Are Important 题目链接 题意:给定一个有向图,结点上有一些石头,两人轮流移动石头,看最后谁不能移动就输了,问先手还后手赢 思路:求出每个结点的sg函数,然后偶数个石头结点可以不用考虑,因为对于偶数情况,总步数肯定能保证是偶数,所以只要考虑奇数情况的结点 代码: #include <stdio.h> #include <string.h> #include <algorithm> #include <vector&g

UVA - 11927 Games Are Important (SG)

Description  Games Are Important  One of the primary hobbies (and research topics!) among Computing Science students at the University of Alberta is, of course, the playing of games. People here like playing games very much, but the problem is that t

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 12585 Poker End Games

题意:Alice和Bob这对狗男女又开始玩游戏了!!!!一开始前者有a元,后者有b元,每次玩,每个人赢得概率是对半开的,令c为a,b中的最小值,那么每次玩,谁输了就给赢的人c元,问Alice赢的概率和游戏的盘数期望值! 思路:貌似会迭代!公式也不好推...发现概率是0.5  然后误差范围是1e-5, 那么只要到达一定深度以后概率就可以忽略不计了! #include <iostream> #include <cstdio> #include <cstring> #incl