#求助 写的时候思路和题解一致,先排序,能拿就拿,但是排序的时候是手写的快排,似乎只有20分,百思不得其解,考虑了精度问题了。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<stdbool.h>
#include<map>
using namespace std;
int a[105], b[105];
double c[105];
map<double, int> aa;
map<double, int> bb;
void qsort(int x, int y)
{
if (x < y)
{
double k = c[x];
int i = x, j = y;
while (i < j)
{
while (j > i && c[j] <= k)
j--;
c[i] = c[j];
while (i<j && c[j]>k)
i++;
c[j] = c[i];
}
c[i] = k;
qsort(x, i - 1);
qsort(i + 1, y);
}
}
inline bool cmp(int a, int b) {
return c[a] > c[b];//性价比从大到小排序
}
int main()
{
int n, m;
double s = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i] >> b[i];
c[i] = b[i]*1.0 / a[i] * 1.0;
aa[c[i]] += a[i];
bb[c[i]] += b[i];
}
//sort(1, n, cmp);//将性价比排序
qsort(1, n);
//for (int i = 1; i <= n; i++)
//printf("%lf\n", c[i]);
for (int i = 1; m > 0&&i<=n; i++)
{
if (m >= aa[c[i]])
{
m -= aa[c[i]];
s += bb[c[i]];
}
else
{
s += (m * c[i]);
m = 0;
}
}
printf("%.2f", s);
return 0;
}
c数组是性价比,用map装了总重量和总价值保证实时改变,跟结构体差不多的效果,可惜出问题了,求解