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<bits/stdc++.h>
#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;
}