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数... */