• Price(洛谷P4109 [HEOI2015]定价)


    题目

    思路:

    按照我的思路这一题应该是这样子的

    剔除+判断

    剔除

    因为后面的0要越多越好,所以我们判断0出现的情况,当2个数之间的差大与10时,证明2个之间会存在一个0,所以这一位我们可以把它去掉,相当于我们已经储存了一个0,当2个数之间差小于10我们就不能再删了,因为这时可能不存在0,如果其中有个数小于10的话,我们也停止,因为再删这个数就会消失(其实继续删也可以,只是不要对长的数字多删除....)

    e.g

    145 160

    由于2个数之间差大于10

    所以就会被我处理成14 16

    那么我们所需要的数就在14~16之间,但很明显的,我们不能选14,因为140不满足条件,所以在剔除数时,我们要记录我们所剔除掉的数是不是为0,如果存在不是0的,那么我们后面就要对14++即15,我们所要找到值也就是在15~16之间即150

        while(m>=10&&n-m>=10)//1.剔除+判断
            {
                if(m%10!=0) x1=true;
                m=m/10;
                n=n/10;
                len3++;
                len4++;
            }
            if(x1==true)//对范围的影响
            {
                m+=1;
            }

     
    接下来我们要做的就是进行特判处理

    1.存在5的整10或整100数,我们可以通过计算很容易得出,这类数是长度最小的,所以我们放到第一个进行特判

    我们记录输入2个数的长度,在这个长度的条件下去寻找,如果一个关于5的整10整100数成立,立刻输出(我就是这一步错了,导致只有50分,因为我在判断时,第一种情况就是50,结果我这么知道有50%的数据 都考到了这个点...)

        int ans=5;
            for(int i=1;i<=len2;i++)//计算是否有5的整数混在其中
            {
                if(ans>=x&&ans<=y)
                {
                    cout<<ans<<endl;
                    fin=1;
                    break;
                }
                ans*=10;
            }

    2.由于关于5的整的都被我们判断完了,那么我们现在就是处理x的长度不等于y的长度的情况,在这种情况下,我们就只需要找到最小整10或整100..的就可以啦

    同样我们在处理时,也要考虑2位数或更多位数其除了首位数以外对数字的影响

        if(fin==0&&len1!=len2)
            {
                while(x>0)
                {
                    if(x%10!=0&&x>10) y2=true; 
                    haha=x;
                    x=x/10;
                }
                if(y2==true) haha+=1;
                for(int i=1;i<len1;i++)
                {
                    haha*=10;
                }
                cout<<haha<<endl;
                fin=1;//对后面的判断有用
            }

    3.考虑长度相同的2个数,虽然这2个数已经被我剔除的差不够10了,但是其数字之间也是可以存在整10的,例如18 26..

    而且期间也可能出现末尾是5的,那么这里我们就要纠结一下,到底是5优还是0优,0啦如上面的例子20 和25 一个的荒谬值为2,一个为3

    所以最后一个特判也就如下,如果这2种情况都不存在,那就是最小的值

        else if(fin==0&&len1==len2)
            {
                for(int i=m;i<=n;i++)
                    {
                        if(i%10==0)
                        {
                            int d=i;
                            for(int j=1;j<=len3;j++)
                            {
                                d*=10;
                            }
                            cout<<d<<endl;
                            fin=1;
                            break;
                        }
                    }
                if(fin==0)
                for(int i=m;i<=n;i++)
                    {
                        if(i%5==0)
                        {
                            int d=i;
                            for(int j=1;j<=len3;j++)
                            {
                                d*=10;
                            }
                            cout<<d<<endl;
                            fin=1;
                            break;
                        }
                    }
                if(fin==0)
                    {
                        int d=m;
                        for(int j=1;j<=len3;j++)
                        {
                            d*=10;
                        }
                        cout<<d<<endl;
                    }
          
    #include<bits/stdc++.h>
    using namespace std;
    int T;
    int x,y;
    bool x1=false;
    bool y2=false;
    int len1,len2,fin;
    int main()
    {
        //freopen("Price.in","r",stdin);
    //    freopen("Price.out","w",stdout);
        cin>>T;
        while(T--)
        {
            scanf("%d%d",&x,&y);
            x1=false;y2=false;
            fin=0;
            int star,len,len3,len4,m,n;
            len1=0;
            len2=0;
            len3=0;
            len4=0;
            m=x;
            n=y;
            while(m>0)
            {
                m=m/10;
                len1++;
            }//计算长度
            while(n>0)
            {
                n=n/10;
                len2++;
            }
            m=x;
            n=y;
            while(m>=10&&m>=10&&n-m>=10)//1.剔除+判断
            {
                if(m%10!=0) x1=true;
                m=m/10;
                n=n/10;
                len3++;
                len4++;
            }
            if(x1==true)//对范围的影响
            {
                m=m+1;
            }
            len=min(len1,len2);
            int ans=5;
            for(int i=1;i<=len2;i++)//计算是否有5的整数混在其中
            {
                if(ans>=x&&ans<=y)
                {
                    cout<<ans<<endl;
                    fin=1;
                    break;
                }
                ans*=10;
            }
            int haha=0;
            if(fin==0&&len1!=len2)
            {
                while(x>0)
                {
                    if(x%10!=0&&x>10) y2=true; 
                    haha=x;
                    x=x/10;
                }
                if(y2==true&&len1!=1) haha+=1;
                for(int i=1;i<len1;i++)
                {
                    haha*=10;
                }
                cout<<haha<<endl;
                fin=1;
            }
            else if(fin==0&&len1==len2)
            {
                for(int i=m;i<=n;i++)
                    {
                        if(i%10==0)
                        {
                            int d=i;
                            for(int j=1;j<=len3;j++)
                            {
                                d*=10;
                            }
                            cout<<d<<endl;
                            fin=1;
                            break;
                        }
                    }
                if(fin==0)
                for(int i=m;i<=n;i++)
                    {
                        if(i%5==0)
                        {
                            int d=i;
                            for(int j=1;j<=len3;j++)
                            {
                                d*=10;
                            }
                            cout<<d<<endl;
                            fin=1;
                            break;
                        }
                    }
                if(fin==0)
                    {
                        int d=m;
                        for(int j=1;j<=len3;j++)
                        {
                            d*=10;
                        }
                        cout<<d<<endl;
                    }
            }
        }
        return 0;
    }
    /*
    思路:
    从最后一位开始比较
    如果前面的不同且包含5
    就选择5
    否则就选择整10数
    #include<bits/stdc++.h>
    using namespace std;
    int T;
    int x,y;
    bool x1=false;
    bool y2=false;
    int len1,len2,fin;
    int main()
    {
        //freopen("Price.in","r",stdin);
    //    freopen("Price.out","w",stdout);
        cin>>T;
        while(T--)
        {
            scanf("%d%d",&x,&y);
            x1=false;y2=false;
            fin=0;
            int star,len,len3,len4,m,n;
            len1=0;
            len2=0;
            len3=0;
            len4=0;
            m=x;
            n=y;
            while(m>0)
            {
                m=m/10;
                len1++;
            }//计算长度
            while(n>0)
            {
                n=n/10;
                len2++;
            }
            m=x;
            n=y;
            while(m>=10&&n-m>=10)//1.剔除+判断
            {
                if(m%10!=0) x1=true;
                m=m/10;
                n=n/10;
                len3++;
                len4++;
            }
            if(x1==true)//对范围的影响
            {
                m=m+1;
            }
            len=min(len1,len2);
            int ans=5;
            for(int i=1;i<=len2;i++)//计算是否有5的整数混在其中
            {
                if(ans>=x&&ans<=y)
                {
                    cout<<ans<<endl;
                    fin=1;
                    break;
                }
                ans*=10;
            }
            int haha=0;
            if(fin==0&&len1!=len2)
            {
                while(x>0)
                {
                    if(x%10!=0&&x>10) y2=true; 
                    haha=x;
                    x=x/10;
                }
                if(y2==true&&len1!=1) haha+=1;
                for(int i=1;i<len1;i++)
                {
                    haha*=10;
                }
                cout<<haha<<endl;
                fin=1;
            }
            else if(fin==0&&len1==len2)
            {
                for(int i=m;i<=n;i++)
                    {
                        if(i%10==0)
                        {
                            int d=i;
                            for(int j=1;j<=len3;j++)
                            {
                                d*=10;
                            }
                            cout<<d<<endl;
                            fin=1;
                            break;
                        }
                    }
                if(fin==0)
                for(int i=m;i<=n;i++)
                    {
                        if(i%5==0)
                        {
                            int d=i;
                            for(int j=1;j<=len3;j++)
                            {
                                d*=10;
                            }
                            cout<<d<<endl;
                            fin=1;
                            break;
                        }
                    }
                if(fin==0)
                    {
                        int d=m;
                        for(int j=1;j<=len3;j++)
                        {
                            d*=10;
                        }
                        cout<<d<<endl;
                    }
            }
        }
        return 0;
    }
    /*
    思路:
    从最后一位开始比较
    如果前面的不同且包含5
    就选择5
    否则就选择整10数...
    */
    View Code
  • 相关阅读:
    LeetCode: Tags-[Array], Difficulty-[Medium]
    J2SE 常用方法
    LeetCode: Tags-[Array], Difficulty-[Easy]
    Java Code Style 记录
    LintCode 1-30;
    Android在线程中发送GET和POST请求 在主线程更新UI
    Android中intent启动Activity中intent.setFlags()的作用
    源码备份 listview
    android数据库操作
    android 验证二
  • 原文地址:https://www.cnblogs.com/KSTT/p/10330227.html
Copyright © 2020-2023  润新知