消灭病毒

题目描述

小明最近喜欢上了一款“消灭病毒”的游戏。游戏中有各种各样不同的病毒,消灭的病毒越多,得分越高。但是在游戏中,玩家一旦被病毒击中将减少一定的生命值。
在游戏中,玩家可以通过添加不同的药水来获取生命值。生命值越高,在游戏中存活的时间越长。
游戏一共提供了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;
}

猜你喜欢

转载自blog.csdn.net/qq_52297656/article/details/115603339
今日推荐