Price(洛谷P4109 [HEOI2015]定价)

题目

思路:

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

剔除+判断

剔除

因为后面的0要越多越好,所以我们我们判断0出现的情况,当2个数之间的差大与10是,证明2个之间会存在一个0,因为位置在前的都可以剔除,那么位置在后的也可以剔除,但是我们在剔除是要注意

e.g

145 160

由于2个数之间差大于10

所以就会被我处理成14 16

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

    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+=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数...
*/
View Code

 

猜你喜欢

转载自www.cnblogs.com/KSTT/p/10330227.html