BZOJ4029 4029: [HEOI2015]定价 贪心

来源:互联网 发布:react js 阮一峰 编辑:程序博客网 时间:2024/06/10 05:02
定义一个数的“荒谬度”为:这个数去除末尾0后的十进制长度p*2,如果此时末尾为5则为p*2-1.
求在区间[L,R]中“荒谬度”最小的数.
贪心。每次在当前数的十进制最后一位+1,如果荒谬度更小则更新答案.

好菜啊。。

#include<bits/stdc++.h>#define LL long long#define clr(x,i) memset(x,i,sizeof(x))using namespace std;LL a,b,lv[13];inline LL cal(int x){int len=log10((double)x)+1,ret;while(x%10LL==0){len--;x/=10LL;}ret=len*2;if(x%10LL==5LL)ret--;return ret;}void add(LL &x){int k=0;while(x%lv[k+1]==0)k++;x+=lv[k];}int main(){int cas;scanf("%d",&cas);lv[0]=1;for(int i=1;i<=11;i++)  lv[i]=lv[i-1]*10LL;while(cas--){scanf("%lld%lld",&a,&b);LL minv,ans,tmp;ans=a;minv=cal(a);//printf("%d\n",minv);while(1){add(a);tmp=cal(a);if(a>b)break;if(tmp<minv)  minv=tmp,ans=a;}printf("%lld\n",ans);}return 0;}