题解 P4109 【[HEOI2015]定价】

此题乍看会超时
但是我考试时本想暴力骗分
结果优化着优化着发现好像不超了,于是A掉


本题暴力递归(贪心)可做
至于优化,想通一个点即可:
为什么不加指数?
想到10的幂就好办了


#include<bits/stdc++.h>
using namespace std;
long long n,L,R,minn=0,res=1,cs=1,pd;
long long pdd(long long x,long long y)
{
	for(long long i=x;i<=y;i++)
	{
		if(i%10==0||i%10==5)
		{
			return 0;
		}
	}
	return 1;
}
long long ws(long long x)
{
	long long tot=0;
	for(long long i=1;i<=x;i*=10)//*=10重要!
	{
		tot++;
	}
	return tot;
}
long long Cmp(long long x,long long y)
{
	for(;;)
	{
		if(x%10==0)
		{
			x/=10;
		}
		if(y%10==0)
		{
			y/=10;
		}
		if(x%10!=0&&y%10!=0)
		{
			if(ws(x)<ws(y))
			{
				return 1;
			}
			else
			{
				if(ws(x)==ws(y))
				{
					if(y%10==5)
					{
						return 0;
					}
					if(x<y||x%10==5)
					{
						return 1;
					}
					else
					{
						return 0;
					}
				}
				else
				{
					return 0;
				}
			}
		}
	}
}
long long findd(long long x,long long y)
{
	if(x>y)
	{
		return 0;
	} 
	if(Cmp(x,res))
	{
		res=x;
	}
	if(x%(cs*10)==0)
	{
		cs*=10;
	}
	findd(x+cs,y);
	return 0; 
}
int main()
{
	//freopen("price.in","r",stdin);
	//freopen("price.out","w",stdout);
	cin>>n;
	for(int js=1;js<=n;js++)
	{
		cin>>L>>R;
		if(R-L<10)
		{
			int tmppdd;
			tmppdd=pdd(L,R);
			if(tmppdd==1)
			{
				cout<<L<<endl;
				continue;
			}
		}
		res=L;
		pd=0;
		cs=1;
		findd(L,R);
		cout<<res<<endl;
	}
	//cout<<0;
}
posted @ 2019-01-02 19:36  G_A_TS  阅读(526)  评论(0编辑  收藏  举报