poj1018
来源:互联网 发布:淘宝开店要6688的费用 编辑:程序博客网 时间:2024/05/19 11:18
poj1018
大致题意:
一个communication system由n个设备组成,每种设备有m个厂家可以生产,它们生产的设备的带宽B 和价格 P不同,问怎样先择可以使得性价比B/P达到最高(其中B是所选设备中最小的,P为设备价格总和)。
例:1 3 //1为测试个数,3为所需设备数
3 100 25 150 35 80 25 //3是厂家数,接下来3组数据分别是各个厂家生产的设备的带宽和价格
2 120 80 155 40
2 100 100 120 110
方法一:搜索+剪枝
因为考虑到B选最小的,因此可以遍历所有情况的B,先把B确定下来,接下来剪去所有比B小的厂家,在每一种设备里面选择比B大价格最小的设备,价格求和,得到B/P,再继续遍历下一个情况的B。时间复杂度为O(n)
#include <stdio.h>#include <stdlib.h>#define MAX 100#define INF 10000struct PAIRS{ int bandwidth; int price;};struct PAIRS p[MAX][MAX];int cmp(const void* a, const void* b){ return (*(int*)a - *(int*)b);}int main(){ freopen("input.txt", "r", stdin); freopen("out1018.txt", "w", stdout); int mi, n, m, i, j, b; scanf("%d", &mi); while(mi--) { memset(p, 0, sizeof(struct PAIRS) * MAX * MAX); maxM = 0; scanf("%d", &n); for(i = 0; i < n; i++) { scanf("%d", &m); for(j = 0; j < m; j++) {//输入设备的带宽和价格 scanf("%d%d", &p[i][j].bandwidth, &p[i][j].price); } qsort(p[i], MAX, sizeof(p[i][0]), cmp);//将同种设备的不同设备进行排序,方便剪枝 } int minP = INF, sumP = 0; float temp = 0, maxBP = 0; for(b = 0; b <1000; b++) {//遍历所有带宽 sumP = 0; //价格总和 for(i = 0; i < n; i++) {//由N种设备组成一个communication system for(j = 0; j < MAX; j++) {//最多100个厂家生产 if(p[i][j].bandwidth < b) {//假设小于确定带宽就跳过 continue; } if(minP > p[i][j].price && p[i][j].price != 0) {//得到最小价格 minP = p[i][j].price; } } sumP += minP;//价格总和 minP = INF; } temp = b * 1.0 / sumP; if(temp > maxBP) {//求最大性价比 maxBP = temp; } } printf("%.3f\n", maxBP); } return 0;}
0 0
- POJ1018
- poj1018
- poj1018
- poj1018
- poj1018
- poj1018
- poj1018
- poj1018
- poj1018
- poj1018
- POJ1018
- poj1018
- poj1018
- poj1018
- poj1018
- POJ1018
- POJ1018
- poj1018
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 根据HSV查找颜色分量
- 栈与队列
- asp.Net通用防注入程序(整站通用)
- C# 存取数据库中的图像
- poj1018
- SharePoint 创建 Lookup 类型的Site Column解决跨站问题
- C#如何在 SQL Server2000 中保存图像及读取图像信息
- linux设备驱动程序中的阻塞机制
- 隐马尔科夫模型
- 图像类型转换及图像压缩
- JDBC MYSQL
- 《Pro Git 2》学习笔记_Chapter 2
- 第十二周上机项目一