POJ1018 Communication System

动态规划题目:
有一个系统有n个设备,每个设备有m个制造商,每个制造商制造的设备的最大带宽和价值是不同的,题目要求计算n个设备组成的系统中max(B/P)。其中B为带宽最小值,P为最大值。

解题思路:
选出所有带宽的最大值和最小值,定下带宽,随后从小到大枚举。
剪枝——对每个厂商的设备按带宽从大到小枚举,若最大带宽都小于我们占定的带宽,则不需要在对这种情况枚举,直接剪枝。

代码:
#include <iostream>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;
const int inf = 0x7fffffff;  
struct node {
    int B;
    int P;
};

bool cmp(node m, node n) {
    return m.B> n.B;
}

int main() {
    int t, n, current_B,current_P;
    int maxb = -inf;
    int minb = inf;
    int minp;
    double ans;
    int x[500];
    scanf("%d",&t);
    node a[500][500];
    while(t--) {
       scanf("%d", &n);
       for(int i = 0; i < n; i++){
              scanf("%d",&x[i]);  
           for(int j= 0; j < x[i]; j++) {
              scanf("%d %d",&a[i][j].B,&a[i][j].P); 
              maxb = max(maxb,a[i][j].B);
              minb = min(minb,a[i][j].B);
           }
           sort(a[i],a[i]+x[i], cmp);
       }
       ans = 0.0;
       for(int i = minb; i <= maxb; i++){
              current_P = 0;
              for(int j = 0; j< n; j++) {
                     minp =10000;
                     for(int k= 0; k < x[j]; k++) {
                           if(a[j][k].B >= i&& a[j][k].P < minp){
                                      minp = a[j][k].P;
                           } else if(a[j][k].B < i) {
                               break;
                           }
                     }
                     current_P+= minp;
              }
       double tem = 1.0*i/current_P;
       if(tem > ans)
             ans = tem;
       }
       printf("%0.3f\n", ans);
    }
    //system("pause");
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值