POJ 3617——Best Cow Line

Posted e-mperor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3617——Best Cow Line相关的知识,希望对你有一定的参考价值。

链接:http://poj.org/problem?id=3617

 

题解

#include<iostream>
using namespace std;
 
const int MAX_N=2e3+50;
int N; //输入字符串的字符个数
int count; //记录字符个数,满足换行要求 
char S[MAX_N]; //存放字符串的数组 
void solve()
    int a=0,b=N-1;
    
    //剩余的字符串起于 S[a],止于 S[b]
    while(a<=b) //若不取等,最终会剩余一个字符 
        //将从左起和从右起的字符进行比较
        bool left=false;
        
        for(int i=0;a+i<=b;++i) //注意这个循环,避免了 if语句无法解决的两侧有好几个相同字符的问题,比如 ACCDBCCB
            if(S[a+i]<S[b-i])
                left=true;
                break;
            
            if(S[a+i]>S[b-i])
                left=false;
                break;
            
        
        if(left) printf("%c",S[a++]); //注意 a++和下面的 b--用法
        else printf("%c",S[b--]);
        
        count++; //除了最后一行,每一行只包含80个大写字母。因为这个问题,PE了好多次,悲痛
        if(count==80)
            printf("\n");
            count=0;
        
    
    printf("\n");

 
int main()
    while(~scanf("%d",&N))
        for(int i=0;i<N;++i)
            scanf(" %c",&S[i]);
        
        solve();    
    
    return 0;

 

为了构造字典序尽可能小的字符串,越靠前的字符 ASCII值越小。所以不断取 S开头和末尾的字符进行比较,选择更小的输出

但要注意,S开头和末尾的字符相同的情况较为复杂,不清楚它们内侧字符的大小。如果用 if 语句判断,又无法解决多个相同字符的情况(总不能一直嵌套的判断下去),这时循环语句就能取得很好的效果(题解中的 for 循环)

字典序比较类的问题经常能用贪心算法

以上是关于POJ 3617——Best Cow Line的主要内容,如果未能解决你的问题,请参考以下文章

Best Cow Line---POJ 3617(贪心)

POJ 3617——Best Cow Line

poj 3617 Best Cow Line

POJ 3617 Best Cow Line

poj3617 Best Cow Line

poj3617 Best Cow Line(贪心,字典序问题)