链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
示例1
输入
1 10
3 5
输出
3
说明
只有一把回旋镖,你可以先打两次伤害为3的,再打一次倾尽全力的,造成的伤害为5。总伤害为3+3+5=11,即可获得胜利。
示例2
输入
2 100
1 30
1 20
输出
52
说明
你可以先把第一把倾尽全力打出去,造成30伤害。接下来用第二把连续攻击50次,造成50伤害。最后把第二把也打出去,造成20伤害。总伤害为30+50+20,即可击杀。
解析:
贪心,计算出 “重复扔” 伤害的最大值 mx,然后把比mx伤害高的全部 “全力” 扔出,最后剩余的血量用mx重复扔即可。
这里有个疑问,如果“重复扔”的最大伤害和 “全力扔” 的最大伤害是同一把飞镖 p ,那么这样计算不会把这个 p 也扔出去吗?
不影响结果,因为这个飞镖 p 的“全力扔”伤害比“重复扔”高,那么最后一次必定会全力扔 p ,所以可以先计算进去,不影响结果。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,h,mx,a[N],cnt,t;
int main(){
scanf("%d%d",&n,&h);
for(int i=1;i<=n;i++){
scanf("%d%d",&t,&a[i]);
mx=max(mx,t);
}
sort(a+1,a+1+n);
reverse(a+1,a+1+n);
for(int i=1;h>0&&i<=n;i++){
if(a[i]>mx) h-=a[i],cnt++;
else break;
}
if(h>0&&h%mx) cnt++;
printf("%d",h>0?cnt+h/mx:cnt);
return 0;
}