贪心水题,将单价从小到大排序,然后先拿便宜的买:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
struct node
{
int p, w;
};
int cmp(node a, node b)
{
return a.p < b.p;
}
node a[1111];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
for(int i=0; i<m;++i)
a[i].w = a[i].p = 0;
for(int i=0; i<m; ++i)
{
scanf("%d%d", &a[i].p, &a[i].w);
}
sort(a, a+m, cmp);
double sum = 0;
for(int i=0; i<m; ++i)
{
if(a[i].w * a[i].p <= n)
{
sum += a[i].w;
n -= a[i].w * a[i].p;
}
else
{
sum += n*1.0 / a[i].p;
break;
}
}
printf("%.2f\n", sum);
}
return 0;
}