POJ1018贪心(多路归并的想法)
题意:
有n个服务器,每个服务器都要安装网线(必须也只能安装一个),然后每个服务器都有mi种选择网线的方式,每种方式两个参数,一个是速度b,另一个是价钱p,然后让你找到一个最大的比值 minb/sump,就是所有的选择中最小的那个速度,必上话的钱的总和。
思路:
这个题目按照讨论组里面的说法估计做法很多,不管了,说下我自己的做法吧,我的做法有点像操作系统里面那个多路归并(如果没记错是叫这个,做题的时候突然想到这个方式,试了下,还真行),具体是这样,枚举最小的b,也就是最小的那个带宽,对于每个服务器,我们可以先把他所有的可选择项都按照带宽从小到大排序,排序后再倒着预处理得到每个选项后面中最小的那个花费,全部这样处理完之后就得到了一个二维的表,然后我们开始枚举,每个表都是根据带宽从小到大排序的,这样所有中最小的那个肯定就是某一个的第一项,我们O(n)的时间找到第一项,以这一项的带宽为最小带宽,花费是当前这个选项的花费,其他的就选最小的花费,然后删除找到的这一项,就这样一直找到头一个服务器的选项全都用完了位置,还有就是删除项的时候可以开一个一维数组,记录当前这个服务器已经用到第几项了,删除第i个服务器的当前项,直接mk[i]++就行了,16msAC,总的时间复杂度最坏应该是 O(n*n*n) 1000000吧。感觉思路有点瞎扯了,呵呵,题目不难,瞎扯就瞎扯吧,好就说这些。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100 + 10
#define INF 1000000000
using namespace std;
typedef struct
{
int b ,p ,minp;
}NODE;
NODE node[N][N];
int now[N] ,num[N];
bool camp(NODE a ,NODE b)
{
return a.b < b.b;
}
int main ()
{
int t ,i ,j ,n ,tmp ,sn;
scanf("%d" ,&t);
while(t--)
{
scanf("%d" ,&n);
for(i = 1 ,sn = 0 ;i <= n ;i ++)
{
scanf("%d" ,&num[i]);
sn += num[i];
for(j = 1 ;j <= num[i] ;j ++)
scanf("%d %d" ,&node[i][j].b ,&node[i][j].p);
sort(node[i] + 1 ,node[i] + num[i] + 1 ,camp);
for(j = num[i] ;j >= 1 ;j --)
{
if(j == num[i] || tmp > node[i][j].p)
tmp = node[i][j].p;
node[i][j].minp = tmp;
}
now[i] = 1;
}
double Ans = 0;
int nowb ,nowp;
while(sn--)
{
nowb = INF;
nowp = 0;
int mkbreak = 0;
for(i = 1 ;i <= n ;i ++)
{
if(now[i] > num[i]) mkbreak = 1;
if(nowb > node[i][now[i]].b)
nowb = node[i][now[i]].b;
}
if(mkbreak) break;
int mk = 0;
for(i = 1 ;i <= n ;i ++)
{
//if(now[i] > num[i]) continue;
if(!mk && nowb == node[i][now[i]].b)
{
mk = 1;
nowp += node[i][now[i]].p;
now[i] ++;
}
else nowp += node[i][now[i]].minp;
}
if(Ans < nowb * 1.0 / nowp)
Ans = nowb * 1.0 / nowp;
}
printf("%.3lf\n" ,Ans);
}
return 0;
}
POJ1018贪心(多路归并的想法)相关推荐
- 多路归并排序_1600W整数排序多路归并
Merge Sort 问题描述 Go 语言实现一个16M的整数(int64)多路归并的数组排序 思路 将待排序数组分成多个组,利用多个goroutine实现各个组的并行排序:然后通过Heap(最小堆) ...
- LA3135简单多路归并(优先队列)
题意: 有N个任务,每个任务都有自己的时间间隔(就是每t秒请求执行一次)和任务id,这n个任务公用一个cpu,每次我们都执行时间靠前的,如果相同时间内有多个任务,就执行任务id小的,要求模 ...
- UVA11997求前k个和,多路归并问题
题意: 给你一个二维矩阵,n*n的,每次从每一行中拿出来一个,然后加起来组成一个和,一共可以得到n^n个和,要求求出这n^n个和中最小的那n个和. 思路: 多路归并问题,先说下多路 ...
- 77. Leetcode 1439. 有序矩阵中的第 k 个最小数组和 (堆-技巧二-多路归并)
技巧二 - 多路归并其实这个技巧,叫做多指针优化可能会更合适,只不过这个名字实在太过朴素且容易和双指 针什么的混淆,因此我给 ta 起了个别致的名字 - 多路归并.多路体现在:有多条候选路线.代码上, ...
- uva 11997 K Smallest Sums 优先队列处理多路归并问题
题意:K个数组每组K个值,每次从一组中选一个,共K^k种,问前K个小的. 思路:优先队列处理多路归并,每个状态含有K个元素.详见刘汝佳算法指南. 1 #include<iostream> ...
- 算法 {多路归并,二路归并,第K大数}
catalog 二路归并 归并操作--并集 暴力 二叉树 归并操作--元素复合 暴力 二叉树 堆维护 行分组 多路归并 归并操作--并集 归并操作--元素复合 例题 二路归并 多路归并 是 二路归并 ...
- 多路归并问题(多个有序表合为一个有序表)
给定k个有序表(不妨假设均为升序),求这k个有序表中最小的n个元素,这类问题称为多路归并问题. 对于这类问题,考虑先取出每个有序表中的最小的元素,在取出的这些元素中的最小值即为所有元素的最小值,必然要 ...
- [HIT-DB-Lab3] 数据库的多路归并算法及其实现
HIT战德臣老师的数据库lab3, 目的是用代码实现一个两阶段多路归并算法, 处理数据, 具体要求如下 目的 思路 先看看ppt上有关内容: 两趟多路归并算法其实不难理解, 如果你的内存足够大, 你可 ...
- 【外排序】外排序算法(磁盘排序、磁带排序) 外存设备结构分析 败者树多路归并 最佳归并树白话讲解
外排序 外排序概述 外排序的基本方法是归并排序法 例子 总结 存储设备(可忽略) 磁带 磁带结构 磁盘 硬盘结构 块 硬盘上的数据定位 磁盘排序 磁盘排序过程 1.生成初始顺串 方法1(常规方法): ...
最新文章
- 每日一皮:客户被绑,蒙眼,惊问 “想干什么?”
- 印中合作国际农民丰收节贸易会-张志祥:谋定农业大健康
- 解决归档出错,ORA-00257: archiver error. Connect internal only, until freed.
- Mysql多表查询(两张独立表,一张关系表)
- Python知识点之Python面向对象
- 【Q】【POJ 2560】【POJ 2031】
- 宝塔pure-ftpd文件管理不显示目录|文件夹打不开
- 【开发工具IDE】eclipse的web项目的tomcat安装部署问题
- 河南省第九届ACM程序设计大赛总结
- Elasticsearch:IP 数据类型及其搜索
- Key was created with errors:报错
- ⚡写一个有发音的背单词软件⚡——四六级必过系列
- OH~My Godness ~!被点到了...
- ESP8266开发之旅 阿里云物联网平台篇④ LED智能灯控制系统(MQTTS客户端直连)
- 第六次实验报告第二部分
- ffmpeg运行在服务器上,如何在脱离流媒体服务器的时候使用ffmpeg 监测.m3u8直播视频流的状态?...
- python 3d图表_matplotlib 三维图表绘制方法简介
- springboot入门-Eclipse
- 京东撸货轻松月入十万,做到这几点,你也可以!
- c++ sort函数排序---vector