A - FatMouse' Trade
https://vjudge.net/contest/244922#problem/A
肥鼠準備了 M 磅的貓糧,準備和看管倉庫的貓交易,倉庫裏裝有他最喜愛的食物 Java 豆。
倉庫有 N 個房間。第 i 間房包含了 J[i] 磅的 Java 豆,需要 F[i] 磅的貓糧。肥鼠不必爲了房間中的所有 Java 豆而交易,相反,他可以支付 F[i] * a% 磅的貓糧去交換得到 J[i] * a% 磅的 Java 豆。這裏,a 表示一個實數。
現在他將這項任務分配給了你:請告訴他,能夠獲得的 Java 豆的最大值是多少。
輸入
輸入包含多組測試數據。
對於每組測試數據,以包含了兩個非負整數 M 和 N 的一行開始。接下來的 N 行,每行相應包含了兩個非負整數 J[i] 和 F[i]。
最後一組測試數據是兩個 -1。所有的整數均不超過 1000。
輸出
對於每組測試數據,在單獨的一行中打印一個實數,精確到小數點後 3 位數,表示肥鼠能夠取得的 Java 豆的最大值。
示例輸入
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1
示例輸出
13.333
31.500
代碼:
#include <stdio.h>
#include <algorithm>
using namespace std;
struct stu
{
double a;
double b;
double c;
}s[1000];
int cmp(stu x,stu y)
{
return x.c>y.c;
}
int main()
{
int m,n,i;
double w,sum;
while(~scanf("%d%d",&m,&n)&&(m+1)&&(n+1))
{
sum=0;
w=0;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&s[i].a,&s[i].b);
s[i].c=s[i].a/s[i].b;
}
sort(s,s+n,cmp);
for(i=0;i<n;i++)
{
if(w+s[i].b<=m)
{
sum=sum+s[i].a;
w=w+s[i].b;
}
else
{
sum=sum+(m-w)*s[i].c;
break;
}
}
printf("%.3lf\n",sum);
}
return 0;
}