POJ1018

http://poj.org/problem?id=1018这题目有点难理解...

大意是说,现在要买一整套通信设备(由好几个部件组成),给你T组测试数据,每一组都有N种部件,而每一种部件备又有m个生厂商提供,他们有不同的带宽和价格,你可以购买n种生产商的任意一种,但是必须购买所有的部件设备才能运作,现在让你求出各个部件的最小带宽/总价格的最大值

可以用贪心的方法做,此题有多个变量,带宽,价格,部件的数量,然而所求的是最小带宽/价值,所以我们可以求出带宽的范围,然后枚举所有的带宽的可能,而这个带宽是最小带宽,所有选取的带宽都必须》=它(这里其实是一种思考的,假设带宽分别为3,4,5而我取2就已经满足了,这可能会造成我的最小带宽取不到(即其他的都大于它而没有一个等于它)但是此时最小带宽/价值一定小于真正的最下限/价值,所以循环到真正的最下限会自然替代)此时带宽已经确定,只需要求出满足最小下限的最小价格即可。最后不断更新比值的最大值

#include <stdio.h>
 int main()
 {
     int T;
     int n,i,j,k,max,min,min2,sum;
     double ans;
     int a[101][101],b[101][101],c[101];;//a是带宽,b是价格,c是有几个设备供选择
     scanf("%d",&T);
     while(T--)
     {
         scanf("%d",&n);
          max=0;
          min=10000;
         for (i=1;i<=n;i++)//i是第几个必备的设备
         {
          scanf("%d",&c[i]);
          for (j=1;j<=c[i];j++)//j是第几个选择
          {
          scanf("%d%d",&a[i][j],&b[i][j]);
          if (a[i][j]>max) max=a[i][j];
          if (a[i][j]<min) min=a[i][j];//找出带宽的上下限范围
          }
         }
         ans=0;
         for (k=min;k<=max;k++)//枚举带宽
         {
         sum=0;
         for (i=1;i<=n;i++)
         {
            min2=10000;//max2是计算每一种必备设备的最小价格
            for (j=1;j<=c[i];j++)
             if ((a[i][j]>=k)&&(b[i][j]<min2))
                min2=b[i][j];
                sum=sum+min2;//sum是每一种带宽固定下,满足所有设备的最小价格(其中每一个设备都尽量取最小值)
        }
        if (ans<k*1.0/sum)
            ans=k*1.0/sum;
         }
         printf("%.3f\n",ans);
         }
         return 0;
 }


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengsigaoju/article/details/49947051
个人分类: 贪心
上一篇poj1328
下一篇poj2243
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭