poj3617

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

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

#include
#include
#include
#include
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>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=false;
                    cnt++;
                    break;
                }
            }
            if(flg) cout<

你可能感兴趣的:(技巧,贪心)