AtCoder Beginner Contest 085 最后一题

em....atcoder beginner的题是真的挺水,稍微有一点点难度就最后两题,感觉不能ak都不好意思说出来。还是做一下总结吧,下一次努力ak!!!

Katana Thrower:https://abc085.contest.atcoder.jp/tasks/abc085_d

题目大意我翻译过来是:给你n个工具,任一个工具可以选择“扔掉”和“擦掉”两种方式中的一种,擦掉的话可以重复利用,扔掉就扔掉了(只能使用一次)。然后现在面对一个怪物,有h点血,问怎么利用这些工具,使得打败怪物攻击的次数最少。

思路:将每一种工具的两种伤害合在一起进行排序(在此之前要先记录一下分别属于什么伤害),然后从最大的开始往下,如果是”扔掉“的伤害值则怪物减去伤害,然后跳到下一个数据;如果是“擦掉”的伤害,则一直重复这个伤害,直到怪物剩余血量<=0;(这里有个地方就是,如果最大的“扔掉”伤害和“擦拭”伤害都对应同一个工具,按我的做法是先扔掉,然后再用那个工具不断重复,这看上去好像反了,但实际上我们可以再反过来,即重复攻击,最后扔掉,一样的。)

ac:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e5+50;
int n,h,th,wi,a,b,cnt;
 
struct data{
    int num,l,r;
}num[maxn<<1];
 
 
bool cmp(data a,data b){
    return a.num>b.num;
}
 
int main(){
    while(cin>>n){
        cin>>h;
        cnt=0;
        for(int i=0;i<(n<<1);i++){
            cin>>a>>b;
            num[i].l=1;
            num[i].num=a;
            num[++i].r=1;
            num[i].num=b;
        }
        sort(num,num+(n<<1),cmp);
        for(int i=0;i<(n<<1);i++){
            if(num[i].r){
                h-=num[i].num;//5
                cnt++;//1
                if(h<=0)
                    break;
                //cout<<"cnta:"<<cnt<<endl;
            }
            else if(num[i].l){
                cnt+=ceil((h*1.0)/num[i].num);
                //cout<<"cnt:"<<cnt<<"h:"<<h<<"num:"<<ceil(h/num[i].num)<<endl;
                break;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值