《ACM程序设计》-Problem-P-交换食物获得最大值问题

来源:互联网 发布:敬汉卿 知乎 编辑:程序博客网 时间:2024/05/29 15:07

题意:

描述

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


解题思路:说实话这道题我看了半天问了好几个人才没明白这道题到底是什么意思,然后解题思路就是先求出各组数的a值,然后按照a的值大小依次交换,如果剩下的M不足以交换全部的n,则乘以a%。

代码如下:

#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;
}






0 0