【优先队列】【链表】【priority_queue】【list】hdu 1434
来源:互联网 发布:mysql删除语句 编辑:程序博客网 时间:2024/06/06 03:08
方法一:优先队列(9203MS 21048K)
方法二:链表(9640MS 33620K)
性能分析:优先队列的方法内存占用较少,速度也更快。
注意:方法一中使用的是 greater functor, 需要重载 ">", 方法二 sort 采用默认的 less functor, 需要重载 "<".
方法一:优先队列
1. 这里的优先队列应该是使用小根堆,因此用 greater
2. 这里用构造函数初始化优先队列,而不是先建立空队列,然后不停 push. 这样做可以省去多次建堆操作,不初始化用的 vector 浪费了空间。
/* * hdu 1434 * http://acm.hdu.edu.cn/showproblem.php?pid=1434 * 【优先队列】【priority_queue】 * 9203MS21048K * 1. 这里的优先队列应该是使用小根堆,因此用 greater * 2. 这里用构造函数初始化优先队列,而不是先建立空队列,然后不停 push. * 这样做可以省去多次建堆操作,不初始化用的 vector 浪费了空间。 */#include <iostream>#include <queue>#include <vector>#include <functional>#include <string>using namespace std;struct SPassenger{ int iRp; string strName;};bool operator>(const SPassenger &oPl, const SPassenger &oPr){ if (oPl.iRp == oPr.iRp) { return (oPl.strName < oPr.strName); } return (oPl.iRp > oPr.iRp);}typedef priority_queue<SPassenger, vector<SPassenger>, greater<SPassenger> > Train;int main(){ vector<Train> vecTrains; int iTrainNum, iCmdNum, iPsgrNum; SPassenger oTmpPsgr; string strTmp; int i, j, iRp; greater<SPassenger> oTmpComp; while (cin >> iTrainNum >> iCmdNum) { while (iTrainNum--) { vector<SPassenger> vecTmp; cin >> iPsgrNum; while (iPsgrNum--) { cin >> oTmpPsgr.strName >> oTmpPsgr.iRp; vecTmp.push_back(oTmpPsgr); } Train oTmpTrain(oTmpComp, vecTmp); vecTrains.push_back(oTmpTrain); } while (iCmdNum--) { cin >> strTmp; if ("GETON" == strTmp) { cin >> i >> oTmpPsgr.strName >> oTmpPsgr.iRp; vecTrains[i-1].push(oTmpPsgr); } else if ("JOIN" == strTmp) { cin >> i >> j; while (!vecTrains[j-1].empty()) { vecTrains[i-1].push(vecTrains[j-1].top()); vecTrains[j-1].pop(); } } else // GETOUT { cin >> i; cout << vecTrains[i-1].top().strName << endl; vecTrains[i-1].pop(); } } vecTrains.clear(); } return 0;}
方法二:链表
之所以用 list, 主要是考虑到合并操作时 list.merge() 能保证有序(前提是参数 list 有序)
/* * hdu 1434 * http://acm.hdu.edu.cn/showproblem.php?pid=1434 * 9640MS33620K * 【链表】【list】 * 之所以用 list, 主要是考虑到合并操作时 list.merge() 能保证有序(前提是参数 list 有序) */#include <iostream>#include <vector>#include <list>#include <string>using namespace std;struct SPassenger{ int iRp; string strName;};bool operator<(const SPassenger &oPl, const SPassenger &oPr){ if (oPl.iRp == oPr.iRp) { return (oPl.strName > oPr.strName); } return (oPl.iRp < oPr.iRp);}typedef list<SPassenger> Train;typedef list<SPassenger>::iterator ItTrain;int main(){ vector<Train> vecTrains; int iTrainNum, iCmdNum, iPsgrNum; SPassenger oTmpPsgr; string strTmp; int i, j, iRp; ItTrain itTrain; while (cin >> iTrainNum >> iCmdNum) { while (iTrainNum--) { Train oTmpTrain; cin >> iPsgrNum; while (iPsgrNum--) { cin >> oTmpPsgr.strName >> oTmpPsgr.iRp; oTmpTrain.push_back(oTmpPsgr); } oTmpTrain.sort(); vecTrains.push_back(oTmpTrain); } while (iCmdNum--) { cin >> strTmp; if ("GETON" == strTmp) { cin >> i >> oTmpPsgr.strName >> oTmpPsgr.iRp; itTrain = vecTrains[i-1].begin(); while ( !(oTmpPsgr < *itTrain) && (itTrain != vecTrains[i-1].end()) ) { ++itTrain; } vecTrains[i-1].insert(itTrain, oTmpPsgr); } else if ("JOIN" == strTmp) { cin >> i >> j; vecTrains[i-1].merge(vecTrains[j-1]); } else // GETOUT { cin >> i; cout << vecTrains[i-1].front().strName << endl; vecTrains[i-1].pop_front(); } } vecTrains.clear(); } return 0;}
0 0
- 【优先队列】【链表】【priority_queue】【list】hdu 1434
- hdu 1873 优先队列 priority_queue
- 【优先队列】【priority_queue】【getline】【istringstream】hdu 1873
- 优先队列Priority_Queue
- 优先队列priority_queue
- 优先队列priority_queue
- STL priority_queue 优先队列
- STL priority_queue 优先队列
- priority_queue优先队列使用
- Priority_queue优先队列
- Priority_queue优先队列容器
- 优先队列(priority_queue)
- priority_queue 优先队列
- 优先队列priority_queue
- 优先队列priority_queue用法
- 优先队列---priority_queue
- 优先队列 priority_queue
- priority_queue(优先队列)
- spring的事务隔离级别
- POJ 1469二分图匹配Hopcroft-Karp算法
- 编译cscope-15.8a遇到的问题与解决方案
- vs2008下安装boost_1_46_1库
- Sun-JNI文档系列之四——第三章:基本类型、字符串类型与数组类型
- 【优先队列】【链表】【priority_queue】【list】hdu 1434
- ORACLE中进程的分类
- 使用git上传已有的代码到github上
- 数据结构-结构体的声明
- 使用httpClient向接口传递数据
- 微信相关
- 软件系统开发 需求定义方法
- 管理你的时间,拒绝拖延症
- vs2008 复制窗体产生错误 .resources”在“Resources”参数中指定了多次。“Resources”参数不支持重复项。