链接:http://codeforces.com/contest/1217
来源:Educational Codeforces Round 72
题意:有一个怪兽,你可以有n中方式去攻击他,一开始他有10个头,对于每一次攻击都可以是怪兽掉d个头,长出来h个头,问最少需要多少次攻击可以消灭怪兽(怪兽没有头即为消灭)。
思路:我们可以贪心的选择攻击的方式,选择经过一次攻击消失的头最多的那一次攻击,每次都选择这种方式的攻击,知道怪兽的头的数量小于等于这一组最大的d即可,那么我们就可以得到 x - times*(d-h) ≤ mmax;即times ≥ ceil((x - mmax)/(d - h))。此外我们还要保证 x ≥ mmax(times ≥ 0),此时表示我们只用一次攻击就可以把怪兽消灭。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Max_n=1e2+10;
const int inf=0x3f3f3f3f;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,x;
scanf("%d%d",&n,&x);
int mmin=inf,d[Max_n],h[Max_n],mmax=0;
for(int i=1;i<=n;i++){
scanf("%d%d",&d[i],&h[i]);
mmax=max(mmax,d[i]);
}
for(int i=1;i<=n;i++){
if(mmax>=x) mmin=1;
else{
if(h[i]>=d[i]) mmin=min(mmin,inf);
else{
int times=ceil((double)(x-mmax)/(d[i]-h[i]));
//int ans=x-times*(d-h);
//cout<<" "<<times<<endl;
mmin=min(mmin,times+1);
}
}
}
printf("%d\n",mmin==inf?-1:mmin);
}
return 0;
}