BZOJ4029 4029: [HEOI2015]定价 贪心

定义一个数的“荒谬度”为:这个数去除末尾0后的十进制长度p*2,如果此时末尾为5则为p*2-1.
求在区间[L,R]中“荒谬度”最小的数.
贪心。每次在当前数的十进制最后一位+1,如果荒谬度更小则更新答案.

好菜啊。。

#include
#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


你可能感兴趣的:(贪心,BZOJ)