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;
}

 

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