pku 1018 DP Communication System解题报告

来源:互联网 发布:zigbee软件测试工程师 编辑:程序博客网 时间:2024/05/21 03:16

一、题目:Communication System

二、题意:n种产品,每种产品也有m[j]种选择.每种产品各有加宽bandwide与价格price,顾客选择n种产品, 其中最大带宽B是所有装置最大带宽的最小值,价格P是所有装置价格之和,求B/P的最大值。

三、解决办法:

      如果采用爆搜的话,时间肯定是不允许的。而从题意可知,如果加宽大而且价格便宜,那么这就更加有可能被选择到的;但如果我们开始爆搜价格之和的话,那将十分困难。我们可以先爆搜加宽bandwide,然后我们再用ibandwidelowhigh枚举,在每种产品选择中搜索加宽bandwide>=iprice较小者.再用贪心选择与更新的resultB/P的最大值)。

四、源代码:

 

#include "stdio.h"

 

int main()

{

       freopen("1.txt", "r", stdin);

 

       int t, n, m[100], b[100][100], p[100][100];  //输入的值

       int i, j, k;                                 //辅助变量 

       int high, low, temp, sum;

       double result;

      

       scanf("%d", &t);

       while (t--)

       {

      scanf("%d", &n);

 

         //设置初值,以便赋值.

      high = 0;                      

      low = 32767;

 

         //获得一个最小和最大带宽:最小带宽low是各个设备最大带宽的最小值,

         //最大带宽high是各个设备最大带宽的最大值.

         //枚举band的最小值与最大值.

      for (i = 0; i < n; i++)

         {

          scanf("%d", &m[i]);

          for (j = 0; j < m[i]; j++)

                {

              scanf("%d%d", &b[i][j], &p[i][j]);

              if (b[i][j] > high)

                       {

                              high = b[i][j];

                       }

              if (b[i][j] < low)

                       {

                              low = b[i][j];

                       }

                }

         }

 

         //从最小值递增到最大值进行寻找,计算各种设备价钱的最小值的和,

         //然后计算出一个比值,如果比值比当前比值大,更换当前比值;

      result = 0.0;

      for (i = low; i <= high; i++)

         {

          sum = 0;

                //贪心的选择n种品牌.

          for (j = 0; j < n; j++)

                {

              temp = 32767;

              for (k = 0; k < m[j]; k++)

                       {

                              //这里的bandprice分别要最大与最小的

                              //这样Bmin/Psum就最大啦!

                  if (b[j][k] >= i && p[j][k] < temp)

                              {

                                     temp = p[j][k];

                              }

              }

              sum += temp;

                }

 

          if ((double) i / (double) sum > result)

                {

                       result = (double) i / (double) sum;

                }

         }

 

      printf("%.3lf/n", result);

 

       }

 

       return 0;

}

五、time:47ms,memory:260k

原创粉丝点击