很簡單的貪心,寫一個結構體,按j/f的比例從大到小排,有限選擇比例大的就行,注意要用double,float可能精度不夠第一次WA了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <vector>
#include <stack>
#include <cstdlib>
#include <queue>
#include <set>
#include <cctype>
using namespace std;
#define loop(i,u,v) for(int i = u;i <= v;i++)
#define rloop(i,u,v) for(int i = u;i >= v;i--)
#define eps 0.00000001
typedef long long ll;
struct stu
{
int x;
int y;
} jf[10001];
bool cmp(stu a,stu b)
{
float rate1 = (float)a.x / a.y;
float rate2 = (float)b.x / b.y;
return rate1 > rate2;
}
int main()
{
int n,m;
while(cin >> n >> m)
{
if(n == -1)
break;
loop(i,1,m)
scanf("%d%d",&jf[i].x,&jf[i].y);
sort(jf+1,jf+1+m,cmp);
double sum = 0;
loop(i,1,m)
{
if(n <= 0)
break;
else if((double)n >= jf[i].y)
{
sum += (double)jf[i].x;
n -= jf[i].y;
}
else
{
sum += (double) jf[i].x / jf[i].y * n;
break;
}
}
printf("%.3lf\n",sum );
}
return 0;
}