`
samwalt
  • 浏览: 286197 次
  • 性别: 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代码

    poj2775.rar_poj_poj 27_poj27_poj2775

    标签"poj poj_27 poj27 poj2775"进一步确认了这是一道关于POJ平台的编程挑战,其中"poj_27"可能是表示第27类问题或者某种分类,而"poj27"可能是对"poj2775"的简写。 压缩文件中的"www.pudn.com.txt"可能是一个链接...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    poj 3757 Simple Distributed storage system.md

    poj 3757 Simple Distributed storage system.md

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    ACM-POJ 算法训练指南

    1. **状态转移方程**:设计复杂的动态规划状态转移方程(poj1191, poj1054, poj3280, poj2029, poj2948, poj1925, poj3034)。 2. **记忆化搜索**:结合动态规划和递归搜索(POJ3254, poj2411, poj1185)。 3. **...

    poj训练计划.doc

    根据给定的文件信息,我们可以总结出一份详细的IT知识训练计划,主要针对编程竞赛和算法学习,特别是聚焦于POJ(Problem Online Judge)平台上的题目训练。这份计划分为两个阶段,初级阶段和中级阶段,共计涉及了165...

    poj题目分类

    * 较为复杂的动态规划:例如 poj1191、poj1054、poj3280、poj2029、poj2948、poj1925、poj3034。 数学 1. 组合数学: * 加法原理和乘法原理。 * 排列组合。 * 递推关系:例如 poj3252、poj1850、poj1019、poj...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...

    poj各种分类

    标题和描述中的“poj各种分类”主要指向的是在POJ(Peking University Online Judge)平台上,根据解题策略和算法类型对题目进行的分类。POJ作为一个知名的在线编程平台,提供了大量的算法练习题,适合从初学者到...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

    poj 3414解题报告

    poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告

    POJ1837-Balance

    【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...

    POJ入门题库(含解题思路和答案)

    这些题目是针对ACM竞赛(ACM International Collegiate Programming Contest,简称ICPC)中的编程训练,POJ(Problem Set for Online Judges)是一个在线的编程竞赛平台,提供了许多算法和逻辑思维的练习题目。...

    poj 1012解题报告

    poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告

    poj 2329解题报告

    poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

Global site tag (gtag.js) - Google Analytics