poj3617

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/RockyHOO1209/article/details/79118939

也是一题贪心的水题,贪心的策略很简单:每次选开头和结尾较大者放入新的字符串的末尾,不过需要注意的是,当首尾相同时需要比较前后的下一个(即左边的右边一个和右边的左边一个)的大小,下一个是较小的那个放入新的字符串,详情可以自己模拟。

这道题比较厉害的是编程的技巧吧,试想如果两边一直相等,直到最中间才出现不同,一般的想法可能是递归,但是数太大,递归肯定不行,这里提供了一个方法,非常棒一定要学会。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int n,l,r,k;
char c[2050];
char s[2050];
bool flg;
int main(){
    while(cin>>n){
        //memset(s,0,sizeof(s));
        memset(c,0,sizeof(c));
        for(int i=0;i<n;i++)
            cin>>c[i];
        int l,r,cnt;
        l=cnt=0;
        r=n-1;
        while(l<=r){
            flg=false;///判断是在l还是r需要移动
            for(int i=0;i<=r-l;i++){///这个循环超级巧妙,如果遇到相同的则从当前位置往后找到不同的,但是l和r值并未改变,所以还是原来的位置
                if(c[l+i]<c[r-i]){
                    flg=true;
                    cnt++;
                    break;
                }
                else if(c[l+i]>c[r-i]){
                    flg=false;
                    cnt++;
                    break;
                }
            }
            if(flg) cout<<c[l++];
            if(!flg) cout<<c[r--];
            if(cnt%80==0) cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}

展开阅读全文

没有更多推荐了,返回首页