本题使用一个简单的贪心算法,首先计算每个房间交换的“性价比”,并从大到小排序。
如果M足够,则优先交换“性价比”高的房间的JavaBeans;M不足时,按照比例将所剩的M交换完。
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
struct room
{
int J;
int F;
double cost;
};
double Max(room* arr, int M, int N);
bool cmpCost(room &r1, room &r2)
{
return r1.cost > r2.cost;
}
int main()
{
int M, N;
while (cin >> M >> N)
{
if (M == -1 && N == -1)
break;
room* arr = new room[N];
for (int i = 0; i < N; i++)
{
cin >> arr[i].J >> arr[i].F;
arr[i].cost = (double)arr[i].J / (double)arr[i].F;
}
cout << fixed << setprecision(3) << Max(arr, M, N) << endl;
}
return 0;
}
double Max(room* arr, int M, int N)
{
double total = 0;
sort(arr, arr + N, cmpCost);
for (int i = 0; i<N && M>0; i++)
{
if (M >= arr[i].F)
{
M -= arr[i].F;
total += arr[i].J;
}
else
{
double percent = (double)M / (double)arr[i].F;
total += percent*arr[i].J;
M = 0;
}
}
return total;
}
知识点:
- sort()是头文件#include <algorithm>中的一个排序函数,时间复杂度为O(N*logN)。
- for循环有多个判断条件时,使用&&,而不是逗号。
继续加油。