Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static class Mooncake implements Comparable<Mooncake> {
double num;
double price;
double unitPrice;
public Mooncake(double num, double price, double unitPrice) {
this.num = num;
this.price = price;
this.unitPrice = unitPrice;
}
@Override
public int compareTo(Mooncake o) {
return o.unitPrice > this.unitPrice ? 1 : -1;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int n = Integer.parseInt(s[0]);
double demandNum = Double.parseDouble(s[1]);
ArrayList<Mooncake> list = new ArrayList<>();
String[] s1 = br.readLine().split(" "), s2 = br.readLine().split(" ");
for (int i = 0; i < n; i++) {
double num = Double.parseDouble(s1[i]);
double price = Double.parseDouble(s2[i]);
double value = price / num;
Mooncake mooncake = new Mooncake(num, price, value);
list.add(mooncake);
}
Collections.sort(list);
double res = 0;
for (int i = 0; i < n; i++) {
if (demandNum >= list.get(i).num) {
res += list.get(i).price;
demandNum -= list.get(i).num;
} else {
res += list.get(i).unitPrice * demandNum;
break;
}
}
System.out.printf("%.2f", res);
}
}
C++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
double n, m;
struct Cake {
double p, w;
bool operator<(const Cake &t) const {
return p / w > t.p / t.w;
}
} c[N];
int main() {
cin >> n >> m;
for (int i = 0; i < n; ++i) cin >> c[i].w;
for (int i = 0; i < n; ++i) cin >> c[i].p;
sort(c, c + (int) n);
double res = 0;
for (int i = 0; i < n && m > 0; ++i) {
double r = min(m, c[i].w);
m -= r;
res += c[i].p / c[i].w * r;
}
printf("%.2lf\n", res);
return 0;
}