#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;
}
POJ1018 Communication System
動態規劃題目:
有一個系統有n個設備,每個設備有m個製造商,每個製造商製造的設備的最大帶寬和價值是不同的,題目要求計算n個設備組成的系統中max(B/P)。其中B爲帶寬最小值,P爲最大值。
解題思路:
選出所有帶寬的最大值和最小值,定下帶寬,隨後從小到大枚舉。
剪枝——對每個廠商的設備按帶寬從大到小枚舉,若最大帶寬都小於我們佔定的帶寬,則不需要在對這種情況枚舉,直接剪枝。
代碼:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.