zoukankan      html  css  js  c++  java
  • hdu 4550 贪婪 思考题 权

    http://acm.hdu.edu.cn/showproblem.php?pid=4550

    想了挺久,然后各种分类 最终AC,假设是现场,对自己没信心的话,预计还是要WA,,,,,,然后搜题解,发现人家都觉得是简单题,看来我还是太弱了,牡丹江没有做出来K看来还是自己贪心和思维有问题

    d是一个Deque

    最朴素的算法是,假设当前的数<=d.front(),那么插入队列的前面,否则插入队列后面,可是有零所以须要单独处理,还是自己多举例找规律

    我的策略:

    1、记录0的个数zero,最小非零的数的个数cnt

    2、推断的策略见代码



    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #include <deque>
    #include <vector>
    #include <queue>
    using namespace std;
    #define IN(s) freopen(s,"r",stdin)
    const int MAXN = 100+5;
    char s[MAXN];
    int a[MAXN],len;
    
    
    void solve()
    {
        deque<int>d;
        int _min=1000,zero=0,cnt=0;
        for(int i=0;i<len;i++)
            if(a[i]) _min=min(_min,a[i]);
            else zero++;
        for(int i=0;i<len;i++)
            if(a[i] == _min)
                cnt++;
        d.push_front(a[0]);//
        if(a[0] == _min)cnt--;
        if(a[0] == 0)zero--;
        for(int i=1;i<len;i++)
        {
            if(a[i]){
                if(d.front())
                {
                    if(a[i]==_min)cnt--;
                    if(a[i]<=d.front())d.push_front(a[i]);
                    else d.push_back(a[i]);
                }
                else//首位是0
                {
                   if(cnt==1 && a[i]==_min)
                    {
                        cnt--;
                        d.push_front(a[i]);
                        continue;
                    }
                    //后面不止一个最小数
                    if(a[i]==_min)cnt--;
                    d.push_back(a[i]);
                }
                continue;
            }
            //a[i]是0的情况
            zero--;
            if(cnt)//后面还有最小值
                d.push_front(a[i]);
            else
                d.push_back(a[i]);
        }
        for(int i=0;i<d.size();i++)
            printf("%d",d[i]);
        putchar('
    ');
    }
    
    
    int main()
    {
       //IN("hdu4550.txt");
        int ncase;
        scanf("%d",&ncase);
        while(ncase--)
        {
            scanf("%s",s);
            len=strlen(s);
            for(int i=0;i<len;i++)
                a[i]=s[i]-'0';
            solve();
        }
        return 0;
    }
    


  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4557207.html
Copyright © 2011-2022 走看看