poj 3617 弱鸡贪心

比赛的时候扣了一道贪心的题目,不会写,,现在补一补一些基础的贪心。

题意:给定一个字符串s,要求按下列操作生成一个新串t--每次从s串中的最前和最后取一个字符给t,要求生成的t字典序最小。

题解:由于是要求字典序最小,满足局部最优的思想贪心的取就可以了(这里要注意的是相等的情况)

ac代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    string s="";
    while(n--)
    {
        string ss;
        cin>>ss;
        s+=ss;
    }
    string t="";
    int i=0;
    int j,len;
    len=s.length();
    j=len-1;
    while(i<=j)
    {
        if(s[i] < s[j])
        {
            t+=s[i];
            i++;
        }
        else if(s[i] > s[j])
        {
            t+=s[j];
            j--;
        }
        else
        {
           int ti=i;
           int tj=j;
           while(s[ti]==s[tj] && ti<=tj)
           {
               ti++;
               tj--;
           }
           if(ti > tj)
           {
               for(int z=i;z<=j;z++) t+=s[i];
               break;
           }
           if(s[ti] < s[tj])
           {
               t+=s[i];
               i++;
           }
           else
           {
               t+=s[j];
               j--;
           }

        }
    }
    int tlen=t.length();
    int ret=0;
    for(int i=0;i<tlen;i++)
    {
        ret++;
        cout<<t[i];
        if(ret==80)
        {
            ret=0;
            cout<<endl;
        }
    }
    return 0;
}

 

posted @ 2017-08-24 19:00  猪突猛进!!!  阅读(110)  评论(0编辑  收藏  举报