UVA 1610 Party Games

题目的意思还是很容易理解的,代码也很容易些,但是细节很多,如果屡不清就会错了也不知道在哪错的。

我开始的想法就是,对于n的字符串,如果第i个字母都相同就直接输出,如果不同就输出排序后的第n/2-1串的第i个字符。

这么写仅仅几个样例能过。

正确的算法是。

将n个字符串排序,直接使用sort即可。然后a为第n/2个字符串,b为第n/2+1个,那么要输出的字符串就介于a,b之间。

对于第i个字符

if(a[i]==b[i]) print(a[i])

否则的话,

if(i==a.length()-1) print(a[i]);

else if(b[i]-a[i]>1 || i!=b.length()) print(a[i]+1) break;

else      //否则的话说明b字符串已经到头了,还剩下从i+1开始的字符串

print(a[i])  

if(a[i]==Z || i==a.length()-1)  print(a[i])

else print(a[i]+1)  break

详解见代码

#include<bits/stdc++.h>
using namespace std;
string st[1005];
vector<int>a;
int main()
{
	int n;
	while(cin>>n && n){
		getchar();		//需要把n过滤掉 
		for(int i=0;i<n;i++) {
			getline(cin,st[i]);
		}
		sort(st,st+n); //排序 
		string a=st[n/2-1];
		string b=st[n/2];
		for(int i=0;i<a.length()&&i<b.length();i++){
			if(a[i]==b[i]) printf("%c",a[i]);		//如果相等直接输出 
			else{
				if(i==a.length()-1){				//如果到达a最后一个字符,直接输出(且说明了b比a长) 
					printf("%c",a[i]);
				}
				else if(b[i]-a[i]>1 || i!=b.length()-1){	//如果b[i]比a[i]大两个字符及以上或者没到b的最后,直接输出a[i]+1 
					printf("%c",a[i]+1);
					break;
				}
				else{									//如果b已经到头了,并且b[i]-a[i]==1;  那么需要看剩下的a 
					printf("%c",a[i]);					//先把a[i]输出了 
					for(int j=i+1;j<a.length();j++){	 
						if(a[j]=='Z' || j==a.length()-1) printf("%c",a[j]);		//如果是z的话需要特判一下(前面不可能出现z的情况,因为b[i]>a[i] 
						else{
							printf("%c",a[j]+1);		//直接输出a[i]+1,break即可 
							break;
						}
					}
					break;
				}
			}
		}
		printf("\n");
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章