POJ 1018 Communication System 题解

本题一看似乎是递归回溯剪枝的方法,我一提交,结果超时。

然后又好像是使用DP,还可能我剪枝不够。

想了很久,无奈忍不住偷看了下提示,发现方法真多,有贪心,DP,有高级剪枝的,还有三分法的,八仙过海各显神通啊。

坏习惯了,没思考够深入就偷看提示了。

幸好及时回头,还不需要看别人的代码了。自己做出来之后,有空看看多种解法的代码也好。

然后我想出自己的思路了,使用贪心,剪枝,DP综合优化下,呵呵,最后程序有点复杂,优化到了16ms,运气好点,或者vector换成原始数组的话,应该可以0MS了。

总体思路就是:

1 利用STL 的set容器记录有多少不同的B值

2 根据不同的B值,用表tbl记录该B值下的最优解

最后比较所有B值下的最优解,得出最终最优解。

下面是优化过的程序,用了不少技巧,加了注释,希望提高参考价值吧。

#include <stdio.h>
#include <float.h>
#include <limits.h>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;

const int MAX_N = 101;
int N, M;

struct BP
{
	int B, P;
	bool operator<(const BP &b) const
	{
		return B < b.B;
	}
};

BP arr[MAX_N][MAX_N];

float DP(set<int> &bset)
{
	for (int i = 0; i < N; i++)
	{
		for (int j = arr[i][0].B-1; j > 0 ; j--)
		{
			arr[i][j].P = min(arr[i][j].P, arr[i][j+1].P);
		}//计算结果为当前大于某个B的最小P值,优化下面填表
	}

	vector<int> bvec(bset.begin(), bset.end());
	int M = (int)bvec.size();	//总共有多少个不同的B值
	vector<vector<int> > tbl(N, vector<int>(M));//记录当前B下的最优P值
	vector<int> idx(N, 1);	//arr行的当前下标

	for (int j = 0; j < M; j++)
	{
		for (int i = 0; i < N; i++)
		{
			for ( ; idx[i] <= arr[i][0].B; idx[i]++)
			{
				if (arr[i][idx[i]].B >= bvec[j])
				{
					tbl[i][j] = arr[i][idx[i]].P;
					break;
				}
			}
			if (idx[i] > arr[i][0].B)//某行无法选出比B更大的值了
			{
				tbl[0][j] = -1;//做好标志,剪枝
				goto out;
			}
		}
	}
out:;
	float ans = 0.0f;
	for (int j = 0; j < M && tbl[0][j] != -1; j++)
	{
		int totalP = 0;
		for (int i = 0; i < N; i++)
		{
			totalP += tbl[i][j];
		}
		ans = max(ans, float(bvec[j])/float(totalP));
	}
	return ans;
}

int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		scanf("%d", &N);
		set<int> bset;
		for (int i = 0; i < N; i++)
		{
			scanf("%d", &arr[i][0].B);	//记录当前维长度
			for (int j = 1; j <= arr[i][0].B; j++)
			{
				scanf("%d %d", &arr[i][j].B, &arr[i][j].P);
				bset.insert(arr[i][j].B);//记录有多少个不同的B值
			}
			sort(arr[i]+1, arr[i]+arr[i][0].B+1);//每维按B值由小到大排序
		}
		printf("%.3f\n", DP(bset));
	}
	return 0;
}

POJ 1018 Communication System 题解,布布扣,bubuko.com

时间: 2024-12-28 01:51:01

POJ 1018 Communication System 题解的相关文章

POJ 1018 Communication System (动态规划)

Communication System Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22500   Accepted: 8008 Description We have received an order from Pizoor Communications Inc. for a special communication system. The system consists of several devices.

poj 1018 Communication System (枚举)

Communication System Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22380   Accepted: 7953 Description We have received an order from Pizoor Communications Inc. for a special communication system. The system consists of several devices.

POJ 1018 Communication System(DP)

http://poj.org/problem?id=1018 题意: 某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1.m2.m3.....mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices. 现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大. 其中B为这n件设备的带宽的最小值,P为这n件设备的总价. 思路:DP解决. d[i][j]代表选择第i个设备时最小带宽j时的价

POJ 1018 Communication System

题意:有n种设备,每种设备都有若干制造商,不同制造商提供设备的带宽和价格不同,现需要每种设备各一个,总带宽为这n个设备的最小带宽,总价格为这n个设备的价格之和,求最大的总带宽/总价格. 解法:枚举+剪枝.枚举最小带宽,将所有设备进行排序,排序的优先级为b->p->id,两个剪枝:1.重复的b不需要枚举.2.当前的b无法满足让所有种类的设备都有设备的带宽大于等于b的时候不需要继续枚举. 剪枝效果拔群……觉得是因为数据有点弱?总之32ms就过了……看到网上题解有说dp的……想了一下……没说b的范围

贪心/poj 1018 Communication System

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int INF=0xfffffff; 6 struct node 7 { 8 int b,p; 9 }; 10 node a[110][110]; 11 int m[110]; 12 int pmin,psum,bmax,n; 13 double ans; 14 int main() 15

POJ - 1018 Communication System (暴力)

题目大意:要买n个零件,每个零件可以由m个厂家提供,每个零件都有相应的b值和p值.(每个零件只能买一个)现在要求你求出最大的min(b) /sum(p) min(b)表示的是每个零件的最小b值 sum(p)表示的是每个零件的p值的和 解题思路:直接暴力 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define maxn 110 struct device{ in

zoj1409 Communication System

[题解]: [代码]: 1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 #define inf 99999999 5 using namespace std; 6 int dp[105][10005];//i件设备,最小带宽(瓶颈)为j时的最小花费 7 int B[105][105]; 8 int P[105][105]; 9 int M[105],N; 10 double fmax(

POJ 1018

Communication System Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25744   Accepted: 9184 Description We have received an order from Pizoor Communications Inc. for a special communication system. The system consists of several devices.

POJ 1018(dp Or 枚举)

Communication System Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23738   Accepted: 8437 Description We have received an order from Pizoor Communications Inc. for a special communication system. The system consists of several devices.