`
samwalt
  • 浏览: 286174 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

poj 1018 Communication System

阅读更多
原题的链接:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1018
   
这题用DP写了个算法,但是WA了,而且我觉得算法空间复杂度会很高。
请教了fuliang同学,他用搜索方法,有很强力的剪枝,一直不太领会
他的算法的思想,看了他写的代码,然后自己总结一下他的算法的思想。

把所有输入的设备按照bandwidth从小到大排序。从最小的bandwidth开始遍历,
依次搜索每一种设备,如果某个设备的bandwidth>=正遍历到的bandwidth,而且
该设备的price小于给定的初始price,那么保存该设备的bandwidth,该设备的price
累加,直到把这一种类的所有设备都遍历完。如果能找到符合要求的设备,那么就继续
遍历下一种类的设备,如果没有找到,就break。

这个算法包含的剪枝思想是:
遍历到某个bandwidth,这个bandwidth作为最小的bandwidth,比它小的bandwidth
都不考虑,在选择每种类型的设备的供应商时,只考虑bandwidth>=选择的bandwidth
的供应商的设备。选择了较大的bandwidth,因为有之前遍历到的bandwidth垫底,
所以总的bandwidth还是遍历到的bandwidth,所以这时候只要考虑找price最小的设备就是了。

很难精确描述出算法的思想,直接观摩fuliang同学的代码有助于理解该算法。
http://fuliang.iteye.com/blog/429100
分享到:
评论
2 楼 samwalt 2009-08-05  

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <limits>

using namespace std;

struct Device{
	int bandwidth;
	int price;
	int type;  //标记该设备的种类
};

vector<Device> d;  //设备集合
const int MAX_INT = numeric_limits<int>::max();
typedef unsigned int uint;

//剪枝函数
double prune(Device **devices, int *mi, int n){
	vector<Device>::iterator iter = d.begin();
	double bp = -1;

	while(iter != d.end()){
		int total_price = 0;
		bool flag;

		for(int i=0;i<n;i++){
			flag = false;
			int min_price = MAX_INT;
			if((*iter).type == i){
				min_price = (*iter).price;
				flag = true;
			}else{
				for(int j=0;j<mi[i];j++)
					if((devices[i][j].bandwidth >= (*iter).bandwidth) && (devices[i][j].price < min_price)){
						min_price = devices[i][j].price;
						flag = true;
					}
			}
			if(flag)
				total_price += min_price;
			else break;
		}
		if(flag){
			double temp_bp = (double)(*iter).bandwidth/total_price;
			if(temp_bp > bp)
				bp = temp_bp;
		}else break;
		iter++;
	}

	return bp;
}
bool cmp(const Device &a, const Device &b){
	return a.bandwidth < b.bandwidth;
}

int main(){
	int t;  //测试用例的数量
	cin>>t;
	while(t--){
		int n;  //设备的种数
		cin>>n;
		Device **devices = new Device*[n];  //所有制造商的所有设备

		int *mi = new int[n];  //某一种设备的制造商数量
		for(int j=0;j<n;j++){
			cin>>mi[j];
			devices[j] = new Device[mi[j]];
			for(int k=0;k<mi[j];k++){
				cin>>devices[j][k].bandwidth>>devices[j][k].price;
				devices[j][k].type = j;
				d.push_back(devices[j][k]);
			}
		}

		//设备集合按带宽从小到大排序
		sort(d.begin(), d.end(), cmp);

		printf("%.3f\n", prune(devices, mi, n));
		d.clear();
		delete[] mi;
		for(int j=0;j<n;j++)
			delete[] devices[j];
		delete[] devices;
	}
	return 0;
}
1 楼 samwalt 2009-08-04  
算法思想正确,代码中有逻辑错误,虽然AC了。

相关推荐

    POJ1018-Communication System

    北大POJ1018-Communication System 解题报告+AC代码

    ACM POJ PKU 最全题目分类

    7. **1409 - Communication System**:通讯系统设计问题。 8. **1425 - Crossed Matchings**:匹配问题的一个变种。 9. **1438 - Asteroids!**:游戏策略问题,涉及到动态规划的应用。 10. **1459 - String Distance...

    POJ题目分类-题库分类

    8. **贪心**:贪心策略是每次选择局部最优解以期望得到全局最优解,例如Packets、Communication System、Gone Fishing等。这类问题需要分析问题特性,找出每一步的最佳决策。 9. **组合数学**:这类题目涉及到组合...

    poj题目分类

    7. **1409 Communication System** - **背景**: 构建通信系统中的成本最小化问题。 - **解法**: 动态规划求解。 8. **1425 Crossed Matchings** - **背景**: 求解交错匹配问题。 - **解法**: 动态规划确定...

    55links友情链接网址跟踪器

    55links友情链接网址跟踪器,放在桌面,每次直接打开就可以访问55links友情链接交易平台,方便快捷。

    [AB PLC例程源码][MMS_046180]CompactFlash Data Storage.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    moore_01_0909.pdf

    moore_01_0909

    FIBR English learning

    FIBR English learning

    [AB PLC例程源码][MMS_042350]How to send-receive SMS text messages using Westermo modem.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    OIF_IEEE802.3_liaison_19OCt09.pdf

    OIF_IEEE802.3_liaison_19OCt09

    SerU,做网络安全FTP内容的实验必备

    做网络安全FTP内容的实验必备

    nagarajan_01_1107.pdf

    nagarajan_01_1107

    [AB PLC例程源码][MMS_043879]Programming in SFC and ST Language.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    mellitz_3cd_01_0318.pdf

    mellitz_3cd_01_0318

    PyQt6实战派 配套代码

    PyQt6实战派 配套代码

    陕西省省级非物质文化遗产民俗经纬度数据统计表

    陕西省省级非物质文化遗产经纬度数据统计表 统计内容包含以下字段: 1. 项目名称 2. 遗产类别 3. 入选批次 4. 所属地区 5. 申报地区/单位 6. 地理经度 7. 地理纬度 该统计表系统记录了陕西省省级非物质文化遗产的地理空间信息,为文化遗产的数字化保护与研究工作提供了重要的数据支撑。

    ran_3ck_02a_0918.pdf

    ran_3ck_02a_0918

    毕业设计-基于springboot+vue开发的汽车租赁管理系统【源码+sql+可运行】50308.zip

    毕业设计_基于springboot+vue开发的汽车租赁管理系统【源码+sql+可运行】【50308】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码; 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - 业务管理:汽车管理、客户管理、租赁订单 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!

    Runcorder - 跑步训练管理系统

    # Runcorder - 跑步训练管理系统 Runcorder 是一款专为跑步爱好者、马拉松运动员及高校体育生设计的本地化跑步训练管理工具,基于 Python 开发,结合 Tkinter 图形界面与强大的数据处理能力,为用户提供从训练记录到数据分析的全方位支持。无论是初学者还是专业跑者,Runcorder 都能帮助你科学规划训练、精准追踪进度,并通过可视化图表直观呈现训练成果,让你的跑步训练更智能、更高效! - **多用户管理**:支持创建、加载和删除用户档案,每个用户的数据独立存储,确保隐私与安全。 - **科学训练记录**:全维度记录跑步数据,包括日期、里程、配速、自评和晨跑标记,支持智能输入校验,避免数据错误。 - **多维数据分析**:通过动态可视化图表展示跑步里程趋势、平均配速曲线,支持自定义 Y 轴范围,帮助用户深入理解训练效果。 - **高阶功能**:提供 4 种科学训练模式(有氧/无氧/混合),支持历史记录修改与删除,数据以 JSON 格式持久化存储,跨平台兼容。

    paatzsch_01_0708.pdf

    paatzsch_01_0708

Global site tag (gtag.js) - Google Analytics