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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章