P2870 (poj 3617) [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold 可爱的贪心

来源:互联网 发布:centos 编辑文件 编辑:程序博客网 时间:2024/05/22 04:57

题目描述

FJ is about to take his N (1 ≤ N ≤ 30,000) cows to the annual”Farmer of the Year” competition. In this contest every farmer arranges his cows in a line and herds them past the judges.

The contest organizers adopted a new registration scheme this year: simply register the initial letter of every cow in the order they will appear (i.e., If FJ takes Bessie, Sylvia, and Dora in that order he just registers BSD). After the registration phase ends, every group is judged in increasing lexicographic order according to the string of the initials of the cows’ names.

FJ is very busy this year and has to hurry back to his farm, so he wants to be judged as early as possible. He decides to rearrange his cows, who have already lined up, before registering them.

FJ marks a location for a new line of the competing cows. He then proceeds to marshal the cows from the old line to the new one by repeatedly sending either the first or last cow in the (remainder of the) original line to the end of the new line. When he’s finished, FJ takes his cows for registration in this new order.

Given the initial order of his cows, determine the least lexicographic string of initials he can make this way.

每次只能从两边取,要求取出来之后字典序最小

输入输出格式

输入格式:
Line 1: A single integer: N

Lines 2..N+1: Line i+1 contains a single initial (‘A’..’Z’) of the cow in the ith position in the original line
输出格式:
The least lexicographic string he can make. Every line (except perhaps the last one) contains the initials of 80 cows (‘A’..’Z’) in the new line.

输入输出样例

输入样例#1:
6
A
C
D
B
C
B
输出样例#1:
ABCBCD

说白了,这个题的意思就是:
给定一串字符,每次只能从两边取,要求取出来之后字典序最小。

嗯,直接贪心就好了!
设两个指针,一个head,一个tail分别指向头和尾;
比较head指针和tail指针的字典序,输出较小的一个,并将指针移向相应的下一位(head++或tail–);
如果head指针和tail指针的字典序相等,进行head++,tail–继续比较直到有一方较小,输出相应字符,更改相应指针。

注意:
1、如果head指针和tail指针的字典序相等时,比较随后的数据时,用循环写,递归会TLE!
2、别忘了换行 O.O
3、循环的时候写一个条件if(head==tail||head+1==tail)break;防止不必要的比较=.=

所以还是贴代码吧:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;int n,m,head,tail;char a[30010];int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        getchar();        scanf("%c",&a[i]);    }    head=1;tail=n;    while(head<tail)    {        m++;        if(a[head]<a[tail])        {            printf("%c",a[head]);            head++;        }        else if(a[head]>a[tail])        {            printf("%c",a[tail]);            tail--;        }        else         {            int h=head,t=tail;            while(a[h]==a[t])            {                if(h==t||h+1==t)break;                h++;t--;            }             if(a[t]<a[h])            {                printf("%c",a[tail]);                tail--;            }            else            {                printf("%c",a[head]);                head++;            }        }        if(m==80){            m=0;            printf("\n");        }    }    printf ("%c",a[tail]);}
原创粉丝点击