题目:FatMouse准备了M磅的猫粮,准备与守卫包含他最喜欢的食物JavaBean的仓库的猫交易。
仓库有N个房间。第i个房间包含J [i]磅的JavaBeans并且需要F [i]磅的猫粮。FatMouse不需要为房间里的所有JavaBeans进行交易,相反,如果他支付F [i] *%磅的猫粮,他可能会得到J磅的JavaBeans。这是一个实数。现在他正在为你分配这个功课:告诉他他可以获得的最大JavaBeans数量。
input:输入包含多个测试用例。每个测试用例以包含两个非负整数M和N的行开始。然后是N行,每行包含两个非负整数J [i]和F [i]。最后一个测试用例后跟两个-1。所有整数不大于1000。
output:对于每个测试用例,在一行中打印一个实数,最多精确到3个小数位,这是FatMouse可以获得的最大JavaBeans数量。
题解:此题要求用M的东西去换每个房间中的东西,要求同一量的东西换的东西越多越好,而且换取东西时候可以分割。
代码实现:
#include <iostream>
#include<algorithm>
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct pp
{
int j,f;
double ave;
} s[10000];
bool cmp(struct pp &p,struct pp &q)
{
return p.ave>q.ave;
}
int main()
{
int i,m,n,k=0;
double sum=0;
while(scanf("%d %d",&m,&n)!=EOF)
{
sum=0;
if(m==-1&&n==-1)
break;
for(i=0; i<n; i++)
{
scanf("%d %d",&s[i].j,&s[i].f); /*循环输入*/
s[i].ave=(double)s[i].j/s[i].f; /*求出一块猫粮换取目标食物的数量*/
}
sort(s,s+n,cmp); /*按换取目标数量多少排序*/
for(i=0; i<n; i++)
{
if(s[i].f<m) /*如果换取第一个仓库里面目标数的总数要小于现在拥有的猫粮数,那么可
以全额换取,补充:此时为什么不要加等于号,其实不是太重要,最多只
会多一次的循环而已*/
{
sum+=s[i].j;
m-=s[i].f;
}
else
{
sum+=s[i].ave*m; /*如果要小于或者等于仓库里面的目标数量,那么可以用自己剩余
break; 的全部进行交换,然后跳出循环*/
}
}
printf("%.3f\n",sum);
}
return 0;
}
刚接触C语言可能有些地方写的不是太好,请个位大佬见谅。