您的位置:首页 > 其它

[BZOJ4029][HEOI2015]定价

2018-11-01 17:56 260 查看

从L开始从小到大暴力枚举。考虑到最后是让非零前缀数字个数最少,那么下面枚举的不可能在当前数的某个后缀零上变动。

于是每次将最后一位不是0的数字+1并统计答案即可。

每一位最多加了10次,一次是9的复杂度,最多9位,故复杂度O(810T)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std;

int T,l,r,ans,mn;

int add(int x){
int k=1;
while (x%10==0) k*=10,x/=10;
return k;
}

int cal(int x){
while (x%10==0) x/=10;
int t=x%10,a=0;
while (x) x/=10,a++;
if (t==5) return 2*a-1; else return 2*a;
}

int main(){
freopen("bzoj4029.in","r",stdin);
freopen("bzoj4029.out","w",stdout);
for (scanf("%d",&T); T--; ){
scanf("%d%d",&l,&r); mn=cal(l); ans=l;
while (1){
l+=add(l);
if (l>r) break;
int t=cal(l);
if (t<mn) mn=t,ans=l;
}
printf("%d\n",ans);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: