PKU ACM 1018 Communication System (DP)

来源:互联网 发布:php给手机发短信 编辑:程序博客网 时间:2024/05/21 02:49

题目链接:Communication System

 

问题描述:

一种通讯系统,由n个零件组成。每个零件有2个属性,带宽和价格。

最终系统的带宽是n个零件中的最小带宽,价格是n个零件价格之和。

求 带宽 / 价格 最大的那个方案的 B / P 值

 

主要思路:

1. 动态规划

2. 用带宽最为索引

     DP[bw] = cost

3. 数据输入的时候,计算出当前输入的最小带宽和最大带宽。可以减少迭代次数。

4. 最后要注意只有一个零件的情况和输出要求小数点后保留3位数字。

     1 1

     1 10 3

 

源代码:

#include <iostream>#include <iomanip>using namespace std;int* bw;int* cost;int* DP;int* tmpDP;int len, FactoryNum;int maxbw, minbw;void GetBP(){int min = 0;memset(tmpDP, -1, sizeof(int) * 1000);for(int i = minbw; i <= maxbw; i++){if(DP[i] != -1){for(int j = 0; j < len; j++){min = (i < bw[j]) ? i : bw[j];if(tmpDP[min] != -1){if(bw[j] + DP[i] < tmpDP[min])tmpDP[min] = cost[j] + DP[i];}else{tmpDP[min] = cost[j] + DP[i];}}}}int* tmp = DP;DP = tmpDP;tmpDP = tmp;return;}void Print(){float bp = 0;for(int i = minbw; i <= maxbw; i++){if(DP[i] != -1){if(((float)i / DP[i]) > bp)bp = (float)i / DP[i];}}cout << fixed << setprecision(3) << bp << endl;}int main(){int TCNum = 0;int PartNum = 0;int curbw = 0, curcost = 0;FactoryNum = 0;DP = new int[1000];tmpDP = new int[1000];cin >> TCNum;while(TCNum--){cin >> PartNum;memset(DP, -1, sizeof(int) * 1000);maxbw = 0;minbw = 1000;int k = 0;for(int i = 0; i < PartNum; i++){cin >> FactoryNum;bw = new int[FactoryNum + 1];cost = new int[FactoryNum + 1];len = FactoryNum;for(int j = 0; j < FactoryNum; j++){cin >> curbw >> curcost;minbw = (curbw < minbw) ? curbw : minbw;maxbw = (curbw > maxbw) ? curbw : maxbw;for(k = 0; k < j; k++){if(curbw < bw[k]){for(int m = j - 1; m >= k; m--){bw[m + 1] = bw[m];cost[m + 1] = cost[m];}bw[k] = curbw;cost[k] = curcost;break;}else if(curbw == bw[k]){if(curcost < cost[k]){bw[k] = curbw;cost[k] = curcost;len = len - 1;break;}}}if(k == j){bw[k] = curbw;cost[k] = curcost;}}if(i == 0){for(int j = 0; j < len; j++)DP[bw[j]] = cost[j];}else{GetBP();}}Print();}return 0;}