消灭病毒C语言

题目描述

小明最近喜欢上了一款“消灭病毒”的游戏。游戏中有各种各样不同的病毒,消灭的病毒越多,得分越高。但是在游戏中,玩家一旦被病毒击中将减少一定的生命值。
在游戏中,玩家可以通过添加不同的药水来获取生命值。生命值越高,在游戏中存活的时间越长。
游戏一共提供了N种药水,第i种药水的体积为V(i),补充的生命值为L(i)。
玩家可以携带一个体积为V的药水瓶。每一种药水可以全部装入药水瓶,也可以只装入一部分。当然,如果你装入一部分药水,那么也只能补充这一部分药水按比例对应的生命值。
请问如何装入药水可以使得初始的生命值最大?请输出最大的初始生命值。

输入

单组输入。
第1行输入两个正整数V和N,分别表示药水瓶的体积和药水的种类数。(N<=100)
接下来N行,每行包含两个正整数,分别对应第i种药水的体积V(i)和生命值L(i)。

输出

输出最大的初始生命值(四舍五入保留两位小数)。

样例输入 Copy

10 3
5 6
3 3
4 2

样例输出 Copy

10.00
ps:这就是一个背包问题,具体请看如下代码

#include <iostream>
#include<algorithm>
using namespace std;
struct node {
    double v, l, c;
}s[105];
int cmp(const node &a, const node& b) {
    return a.c > b.c;
}
int main() {
    int v, n; scanf("%d %d", &v, &n);
    for (int i = 1; i <= n; i++) {
        cin >> s[i].v >> s[i].l;
        s[i].c = s[i].l / s[i].v;
    }
    sort(s + 1, s + 1 + n, cmp);//从大到小排序
    double sum = 0;
    for (int i = 1; i <= n; i++)
    {
        if (s[i].v <= v)
        {
            v -= s[i].v;
            sum += s[i].l;
        }
        else {
            sum += s[i].c * v;
            break;
        }
    }
    printf("%.2f\n", sum);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间邮递员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值