BZOJ4029 4029: [HEOI2015]定价 贪心

定义一个数的“荒谬度”为:这个数去除末尾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;
}


发布了39 篇原创文章 · 获赞 4 · 访问量 5821

猜你喜欢

转载自blog.csdn.net/Wolf_Reiser/article/details/78573108
今日推荐