POJ 3617 Best Cow Line (贪心)

题意: 给定长度为N的字符串S,要构造一个长度为N的字符串T。起初T是一个空串,随后反复进行下列任意操作

1.从字符串S头部删除一个字符,加到T的尾部

2.从字符串S尾部删除一个字符,加到T的尾部

目的是,构造字典序尽可能小的字符串T

思路:简单贪心,比较当前字符串S首尾字符的大小,选取小的加入T,若两者相同,则比较下一个字符。

#include<stdio.h>
#include<queue>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#define INF 0x3f3f3f3f
#define LL long long
#define MOD 100000007
#define MAXSIZE 10005

using namespace std;

char s[MAXSIZE],t[MAXSIZE];

int main()
{
    int n,lt;
    char ch;
    while(scanf("%d
",&n)!=EOF)
    {
        lt=1;
        for(int i=1;i<=n;i++)
            scanf("%c%c",&s[i],&ch);

        int p1=1,p2=n;
        while(p1 <= p2)
        {
            if(s[p1] < s[p2])
            {
                t[lt++] = s[p1];
                p1++;
            }

            else if(s[p1] > s[p2])
            {
                t[lt++] = s[p2];
                p2--;
            }

            else
            {
                int t1 = p1;
                int t2 = p2;
                while(s[t1] == s[t2] && t1<t2)
                {
                    t1++;
                    t2--;
                }
                if(s[t1] <= s[t2])
                {
                    t[lt++] = s[p1];
                    p1++;
                }

                else
                {
                    t[lt++] = s[p2];
                    p2--;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            printf("%c",t[i]);
            if(i%80==0)
                printf("
");
        }
            
    }
    return 0;
}
View Code