POJ 3617 Best Cow Line [贪心] [字典序最小]

来源:互联网 发布:mac 剪切 编辑:程序博客网 时间:2024/06/09 17:18

POJ 3617 Best Cow Line
给定长度为n 的字符串S,现要构造一个长度为n 的字符串T. 初始T 为空串,随后可以从S 头部删除一个字符加到T 的尾部,或是从S 尾部删除一个字符加到T 的尾部,求字典序最小的T
1 <=n<=2000


那么直接比较两个指针的值是不完全正确的,因为还有相同的情况,为了让字典序最小,需要继续比较指针下一个位置的值,知道两个指针相遇或者有不相同的停止。

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<queue>#include<stack>#include<map>#include<set>#include<string>#include<iomanip>#include<ctime>#include<climits>#include<cctype>#include<algorithm>#ifdef WIN32#define AUTO "%I64d"#else#define AUTO "%lld"#endifusing namespace std;#define smax(x,tmp) x=max((x),(tmp))#define smin(x,tmp) x=min((x),(tmp))#define maxx(x1,x2,x3) max(max(x1,x2),x3)#define minn(x1,x2,x3) min(min(x1,x2),x3)const int INF=0x3f3f3f3f;const int maxn = 2005;char s[maxn],t[maxn];int top;int n;int main(){#ifndef ONLINE_JUDGE    freopen("cow.in","r",stdin);    freopen("cow.out","w",stdout);#endif    scanf("%d",&n);    char ch = getchar();    for(int i=0;i<n;i++)    {        while(!isalpha(ch)) ch=getchar();        s[i]=ch;        ch = getchar();    }    int head=0,tail=n-1;    while(head^tail)    {        bool isleft=true;        for(int i=0;head+i<=tail-i;i++) if(s[head+i]^s[tail-i])            if(s[head+i]<s[tail-i]) { isleft=true;break; }            else { isleft=false;break; }        if(isleft) t[++top]=s[head++];        else t[++top]=s[tail--];    }    t[++top]=s[head];    for(int i=1;i<=top;i++)    {        putchar(t[i]);        if(i%80==0 && i^top) putchar('\n');    }    return 0;}
0 0
原创粉丝点击