题意:
描述
FatMouse准备了M磅的猫食,准备与猫守卫仓库包含他最喜欢的食物,JavaBean贸易。
仓库有N个房间。第i个房间包含J [i]磅的JavaBeans,需要F [i]磅的猫食。FatMouse不必为房间里的所有JavaBean交易,相反,如果他支付F [i] *一磅%的猫粮,他可能会得到J [i] *%的JavaBean。这里a是一个实数。现在他正在为你分配这个作业:告诉他他可以获得的JavaBeans的最大数量。
输入
输入由多个测试用例组成。每个测试用例以包含两个非负整数M和N的行开始。然后N行跟随,每行分别包含两个非负整数J [i]和F [i]。最后一个测试用例后面跟两个-1。所有整数不大于1000。
输出
对于每个测试用例,在一行中打印一个精确到小数点后三位的实数,这是FatMouse可以获得的最大JavaBeans数量。
样品输入
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1
样品输出
13.333
31.500
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{ int i,q,w;
double b[1004],c[1004],d[1004],sum=0,k,m,n;
while(cin>>m>>n)
{ if(m==-1&&n==-1)
break;
for(i=0;i<n;i++)
{
cin>>c[i]>>d[i];
b[i]=c[i]/d[i];
}
for(w=0;w<n;w++)
{ k=0;
for(i=0;i<n;i++)
{
if(b[i]>k)
{
k=b[i];
q=i;
}
}
if(d[q]<=m)
{sum+=c[q];
m-=d[q];
c[q]=d[q]=b[q]=-1;
}
else
{
m=m*b[q];
sum+=m;
c[q]=d[q]=b[q]=-1;
break;
}
}
printf("%.3lf\n",sum);
sum=0;
}
return 0;
}
回顾:这道题思路清晰后写出来很快但是提交的时候总是分割错误,然后debug了半个多小时把原来不必要的许多东西都加上了显得很冗杂,到最后发现只是因为数组开的太小了,做题的时候需要留心数据范围大小。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{ double a[1005],b[1005],w[1005];
double k,c,d,sum=0,h;
int i,t;
//freopen("a.txt","r",stdin);
while(cin>>c>>d)
{
if(c==-1&&d==-1)
break;
sum=0;
for(i=0;i<d;i++)
{cin>>w[i]>>a[i];
b[i]=w[i]/a[i];}
h=0;
while(c>0&&h<d)//注意,一定要加h来判断是否已经将食物全部交换完,也许自己手中还有剩余的没有交换但是对方已经没了。就这个地方第二次做一直错,按道理说每次交换完以后清零应该不会有问题,想不明白。
{ k=0;t=0;
for(i=0;i<d;i++)
if(k<=b[i])
{
k=b[i];
t=i;
}
if(c>a[t])
{
c-=a[t];
sum+=w[t];
b[t]=-1;
}
else if(c<=a[t])
{
sum+=c*b[t];
b[t]=-1;
c=0;
break;
}
h++;
}
printf("%.3lf\n",sum);
}
return 0;
}