描述
阿短很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料。申请国外的大学,需要缴纳一定的申请费用,阿短总共只攒了n万美元。他将在m个学校中选择若干的(当然要在他的经济承受范围内)学校投递申请。每个学校都有不同的申请费用a,阿短预估了他得到某个学校offer的可能性b(不同学校之间是否得到offer不会互相影响)。请帮阿短计算一下,他至少可以收到一份offer的最大概率。
输入
输入第一行有两个正整数n,m(0<=n<=10000,0<=m<=10000),接下来m行,每行都有两个数据ai(整型),bi(实型)分别表示第i个学校的申请费用和可能拿到offer的概率。用两个0表示输入结束。
输出
每组数据都对应一个输出,表示阿短得到至少一份offer的最大概率。用百分数表示,精确到小数点后一位。
输入样例 1
10 3 40.1 40.2 50.3 0 0
输出样例 1
44.0%
思路:这题我首先选择了贪心该算法的思想是按照每所学校可能得到的 offer 的概率排序,然后依次选择申请费用最少的学校,直到阿短的经济承受范围内无法选择更多学校为止。代码如下(部分AC)
#include <iostream>
#include <algorithm>
using namespace std;
struct School {
int cost;
double probability;
};
bool cmp(const School &a, const School &b) {
return a.probability > b.probability; // 按照 probability 从大到小排序
}
int main() {
int n, m;
School schools[10001];
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> schools[i].cost >> schools[i].probability;
}
sort(schools, schools + m, cmp); // 对 schools 数组按照 probability 进行排序
double ans = 0;
for (int i = 0; i < m; i++) {
if (n >= schools[i].cost) { // 若能够承担申请费用,则计算概率
ans = max(ans, 1 - (1 - ans) * (1 - schools[i].probability)); // 迭代计算最大概率
n -= schools[i].cost;
}
else { // 若无法承担申请费用,则退出循环
break;
}
}
printf("%.1f%%\n", ans * 100); // 将最大概率转换为百分数输出
return 0;
}