hdu6789-1007 Fight 2020 年百度之星·程序设计大赛 - 初赛三

http://acm.hdu.edu.cn/showproblem.php?pid=6789

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=891&pid=1007

大家都会这题,只有我想个弱智一样在枚举血量dp,然后血量和次数的关系方程解不出。。。

然而枚举次数就可以了,我们想让L为0,那么枚举L和M,L和R的次数使他为0就行了,然后再计算M-R的次数使M,R其中之一为0,更新答案,

由于L不一定要变0,可以是M和R变0,所以做两遍

注意枚举变0的要恰好变0,因为只能打那么多次,不能打更多,所以少一次的时候需要是>0的。

#include
#define pb push_back
using namespace std;
typedef long long ll;

const int maxl=3e5+10;

int n,m,cas,k,cnt,tot,ans;
int a,b,c;
char s[maxl];
bool in[maxl]; 

inline void prework()
{
	scanf("%d%d%d",&a,&b,&c);
} 

inline void mainwork()
{
	ans=1000;int resa,resb,resc,l,r;
	for(int i=0;i<=1000;i++)
		for(int j=0;j<=1000-i;j++) 
		if(1000-i*b-j*c<=0)
		{
			if(i>0 && (1000-(i-1)*b-j*c<=0 || 1000-(i-1)*a<=0))
				continue;
			if(j>0 && (1000-i*b-(j-1)*c<=0 || 1000-(j-1)*a<=0))
				continue;
			resb=1000-i*a;
			resc=1000-j*a;
			if(resb<=0 || resc<=0)
				ans=min(i+j,ans);
			else
			{
				l=resb/c+(resb%c!=0);
				r=resc/b+(resc%b!=0);
				ans=min(ans,i+j+min(l,r));
			}
		}
	for(int i=0;i<=1000;i++)
		for(int j=0;j<=1000-i;j++)
		if(1000-i*a-j*c<=0)
		{
			if(i>0 && (1000-(i-1)*a-j*c<=0 || 1000-(i-1)*b<=0))
				continue;
			if(j>0 && (1000-i*a-(j-1)*c<=0 || 1000-(j-1)*b<=0))
				continue;
			resa=1000-i*b; 
			resc=1000-j*b;
			if(resa<=0 || resc<=0)
				ans=min(i+j,ans);
			else
			{
				l=resa/c+(resa%c!=0);
				r=resc/a+(resc%a!=0);
				ans=min(ans,i+j+min(l,r));
			}
		}
}

inline void print()
{
	printf("%d\n",ans);
}

int main()
{
	int t=1;
	scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

你可能感兴趣的:(hdu6789-1007 Fight 2020 年百度之星·程序设计大赛 - 初赛三)