POJ1018

来源:互联网 发布:linux清除所有arp缓存 编辑:程序博客网 时间:2024/06/13 04:01

贪心思想;

让求B/P的max

B是所确定的物品中的最小宽度;

P是说确定的物品的价格总和;

求出最小和最大的B;

枚举B,求在B为最小宽度的条件下P的最小值;

{  贪心思想 :找出每个MI总最小的价格,这样的话P的和一定是最小的}



#include <iostream>

#include <stdio.h>
#include <string.h>
#include <algorithm>


#define maxn 200


using namespace std;




struct node
{
    int b,p;
};


node obj[maxn][maxn];
int mi[maxn];
int b1[maxn*maxn];




int main()
{
    int t,n,m;
    int i, j, k, l;
    double temp,stemp;
    double maxdp,minp;


    scanf("%d",&t);
    while(t--)
    {
        memset(b1,0,sizeof(b1));
        memset(mi,0,sizeof(mi));


        int count = 0;
        scanf("%d",&n);
        temp = stemp =  maxdp = minp = 0;


        for( i = 0; i< n; i++)
         {
             scanf("%d",&mi[i]);
              for( j = 0; j < mi[i]; j++)
               {
                   scanf("%d%d",&obj[i][j].b, &obj[i][j].p);
                   b1[count++] = obj[i][j].b;


               }
         }
         sort(b1,b1+count);


        for( l = 0;  l < count; l++)
        {
              i = b1[l];
              stemp = 0;


          for( j = 0; j < n; j++)
            {
                minp = 10000000;
                for( k = 0; k < mi[j]; k++)
                 {
                     if( obj[j][k].b >= i && obj[j][k].p < minp )
                          minp = obj[j][k].p;
                 }
                stemp +=  minp;
                //cout<<stemp<<endl;
            }


            temp=i*1.0/stemp;
             if(temp>maxdp)
                maxdp=temp;
        }
     printf("%.3lf\n",maxdp);
    }
    return 0;


}
0 0
原创粉丝点击