POJ3617 Best Cow Line 馋

虽然这个问题很简单,但非常好,由于过程是很不错的。发展思路的比较 并鼓励人们,不像有些贪心太偏,推动穷人,但恼人

鉴于长N弦S,然后又空字符串STR。每当有两个选择 1:删S增加虚假的第一要素STR于      2:删S增加最后一个元素STR于

是的STR字典序最小 并输出


開始可能没有什么顾虑的去想 每次比較S的头和尾元素 取小的那个删除并假如STR中。可是若S的头和尾元素一样的话这种方法就不行了,由于先取头或者尾还得看他们之间的元素,这时候是倒着来还是顺着好呢?那就直接拿顺的跟倒的进行字典序的大小比較就好了,这样当头尾相等时就能把他们中间的囊括进去,

做法:

字符串S。然后倒置得到S1,比較大小若S小,则取S的头部元素。若S大则取S的尾部元素,然后再把S倒置。再与它的倒置比較,如此循环的做N次就可以


#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#include<cctype>

#define ll long long

#define LL __int64

#define eps 1e-8

#define inf 0xfffffff

//const LL INF = 1LL<<61;

using namespace std;

//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;

string s;
string str;
string ans;
string ch;

int main() {
	int n;
	bool flag = false;
	while(cin>>n) {
		while(n--) {
			cin>>ch;
			s += ch;
		}
		str = s;
		reverse(s.begin(),s.end());
		int len = s.length();
		while(len--) {
			if(str < s) {
				ans += str[0];
				str.erase(0,1);
			}
			else {
				ans += str[str.length() - 1];
				str.erase(str.length() - 1,1);
			}
			s = str;
			reverse(s.begin(),s.end());
		}
		for(int i=0;i<ans.length();i++) {
			cout<<ans[i];
			if((i+1)%80 == 0)puts("");
		}
		puts("");
	}
	return 0;
}


版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/yxwkf/p/4757114.html