AtCoder Beginner Contest 085 D Katana Thrower (贪心+计算机除法特性)

博客介绍了AtCoder Beginner Contest 085的一道题目,涉及如何使用贪心策略来解决问题。内容包括题目的背景(宝剑与生命值)、宝剑的砍伤和扔伤概念,以及解题思路:首先选取造成最大砍伤的宝剑,接着计算扔伤大于砍伤的宝剑数量,最后判断通过砍伤和扔伤能否击败怪兽。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Statement
You are going out for a walk, when you suddenly encounter a monster. Fortunately, you have N katana (swords), Katana 1, Katana 2, …, Katana N, and can perform the following two kinds of attacks in any order:


Wield one of the katana you have. When you wield Katana i (1≤i≤N), the monster receives ai points of damage. The same katana can be wielded any number of times.
Throw one of the katana you have. When you throw Katana i (1≤i≤N) at the monster, it receives bi points of damage, and you lose the katana. That is, you can no longer wield or throw that katana.
The monster will vanish when the total damage it has received is H points or more. At least how many attacks do you need in order to vanish it in total?


Constraints
1≤N≤105
1≤H≤109
1≤ai≤bi≤109
All input values are integers.
Input
Input is given from Standard Input in the following format:


N H
a1 b1
:
aN bN
Output
Print the minimum total number of attacks required to vanish the monster.


Sample Input 1


1 10
3 5
Sample Output 1


3
You have one katana. Wielding it deals 3 points of damage, and throwing it deals 5 points of damage. By wielding it twice and then throwing it, you will deal 3+3+5=11 points of damage in a total of three attacks, vanishing the monster.


Sample Input 2


2 10
3 5
2 6
Sample Output 2


2
In addition to the katana above, you also have another katana. Wielding it deals 2 points of damage, and throwing it deals 6 points of damage. By throwing both katana, you will deal 5+6=11 points of damage in two attacks, vanishing the monster.


Sample Input 3


4 1000000000
1 1
1 10000000
1 30000000
1 99999999
Sample Output 3


860000004
Sample Input 4


5 500
35 44
28 83
46 62
31 79
40 43
Sample Output 4


9

题意:给n个宝剑,h的生命值,给出n个宝剑的砍伤害和扔伤害,砍可以砍无数次,扔只能一次并且扔完之后不能再用此剑砍。

思路:贪心:找出砍的最大伤害,然后在扔伤害中,找出比砍伤害大的个数,总伤害减去所有的扔伤害之后,判断怪兽是否死亡,为死亡再计算用多少此砍伤害

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <stack>
#define N 100005
using namespace std;
typedef long long ll;
ll a[N],b[N],sumb[N]= {0};
int main()
{
 
    ll n,y;
    while(scanf("%lld%lld",&n,&y)==2)
    {
        ll imax=-111111,sum=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%lld%lld",&a[i],&b[i]);
            if(a[i]>imax)
                imax=a[i];
        }
        int num=0;
        sort(b+1,b+1+n);
        for(int i=n; i>=1; i--)
        {
            if(imax<=b[i]&&y>0)
            {
                y=y-b[i];
                num++;
            }
        }
        y=y-sum;
        int r=y/imax;
        if(r>0)
        {
            if(r*imax<y)
                r++;
            num+=r;
        }
        printf("%d\n",num);
    }
 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值