Stall Reservations POJ - 3190

2023-11-09

这道题,是学长给我们布置的学习用的题目,重在给我们讲解了什么是优先队列以及其对应的贪心问题。

好了,先送上(中文翻译过的题意)手动「滑稽」

Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows. 

Help FJ by determining:
  • The minimum number of stalls required in the barn so that each cow can have her private milking period
  • An assignment of cows to these stalls over time
Many answers are correct for each test dataset; a program will grade your answer.
Input
Line 1: A single integer, N 

Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Output
Line 1: The minimum number of stalls the barn must have. 

Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.
Sample Input
5
1 10
2 4
3 6
5 8
4 7
Sample Output
4
1
2
3
2
4
Hint
Explanation of the sample: 

Here's a graphical schedule for this output: 

Time     1  2  3  4  5  6  7  8  9 10

Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>

Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..

Stall 3 .. .. c3>>>>>>>>> .. .. .. ..

Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
Other outputs using the same number of stalls are possible.

哦那些挑剔的N(1 <= N <= 50,000)牛!它们非常挑剔,只能在精确的时间间隔A..B(1 <= A <= B <= 1,000,000)内进行挤奶,包括时间A和B.显然,FJ必须创建预订系统确定每头牛可以分配哪个牛奶挤奶时间。当然,没有牛会与其他牛分享这样一个私人时刻。 

通过确定:帮助FJ
  • 谷仓所需的最小摊位数量,以便每头奶牛可以有自己的挤奶期
  • 随着时间的推移,牛将这些摊位分配给这些摊位
许多答案对于每个测试数据集都是正确的; 一个程序将评分你的答案。
输入
第1行:单个整数,N 

第2..N + 1行:第i + 1行用两个空格分隔的整数描述奶牛的挤奶间隔。
产量
1号线:谷仓必须有的最小摊位数量。 

第2..N + 1行:第i + 1行描述了奶牛我将被分配给她的挤奶期的摊位。
示例输入
5
1 10
2 4
3 6
5 8
4 7
示例输出
4
1
2
3
2
4
暗示
示例说明: 

以下是此输出的图形计划: 

时间1 2 3 4 5 6 7 8 9 10
 
档位1 c1 >>>>>>>>>>>>>>>>>>>>>>>>>>>
 
档位2 .. c2 >>>> >> c4 >>>>>>>>> .. ..
 
摊位3 .. .. c3 >>>>>>>>> .. .. ..
 
摊位4 .. .. .. c5> >>>>>>>> .. ..
其他使用相同数量档位的输出也是可能的。

接下来我得讲讲我的思路(对大佬而言可能过于繁琐,但是适用于广大萌新哦),这是我第一次遇上这类题,把它记下来写在小本本上去。

        这道题的目的是让我们用尽量少的摊位,且让所有在同一摊位的“区间段”互不干涉(碰头也不行)。

        那么,这里所需要用到的算法就是priority_queue以及总所周知的贪心,在这里,我们要活用优先队列,优先队列有冗长的“priority_queue<int ,vector<int> ,less<int> >”以及“priority_queue<int ,vector<int> ,greater<int> >”,但是,我们不用那么复杂的处理,在用struct定义一个结构体类型时,我们用了些窍门:

            friend bool operator<(node a, node b)

            {

                    return a.en>b.en;

            }

使得将来的优先队列中的所有元素都是后结束的在前,但是,这又是远远不够的,我们知道了结束,还需要有开始的排序,那么,sort()操作就少不了,此处插入一条结构体类型的快排:

bool cmp (node a, node b)

{

    return a.st<b.st;

}

    现在,我们搞定了对全体区域的排序,接下来就要讲到贪心操作了,我们为了使得尽可能少的用摊位,就需要使得每个摊位尽可能的充实,首先,第一头牛无论如何都是需要一个摊位的,把它放入优先队列,我们将它给放入第一个摊位,再将后来的牛一一进入,从第二头牛开始直至第N头牛,我们在判断他的左端区间是否可以紧跟上一头牛的右端区间,如果可以,把它放入上一头牛的摊位上去,则将这头牛入队列之前,前一头牛已经无法作为比较对象了,那么T了他!如果这头牛太矫情,他没法跟上一头牛保持良好距离,那么,它的摊位就是上一头牛的摊位+1,因为上一头牛后面还没找到可以尾随的对象,不能T了,所以只需要把这头牛入队就行。

      到了附上AC代码的时候了:(写的菜,请多多包容)

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
int N;
int place[50005];
struct node
{
    int st,en,pos;
    friend bool operator<(node a,node b)
    {
        return a.en>b.en;
    }
}a[50005];
bool cmp(node a,node b)
{
    return a.st<b.st;
}
priority_queue<node> Q;
int main()
{
    while(scanf("%d%*c",&N)!=EOF)
    {
        int ans=1;
        for(int i=1;i<=N;i++)
        {
            scanf("%d %d%*c",&a[i].st,&a[i].en);
            a[i].pos=i;
        }
        sort(a+1, a+N+1, cmp);
        place[a[1].pos]=1;
        Q.push(a[1]);
        for(int i=2;i<=N;i++)
        {
            if(!Q.empty()&&Q.top().en<a[i].st)
            {
                place[a[i].pos]=place[Q.top().pos];
                Q.pop();
            }
            else
            {
                ans++;
                place[a[i].pos]=ans;
            }
            Q.push(a[i]);
        }
        printf("%d\n",ans);
        for(int i=1;i<=N;i++)
        {
            printf("%d\n",place[i]);
        }
        while(!Q.empty())
        {
            Q.pop();
        }
    }
    return 0;
}

Thanks for watching!

希望对大家有帮助吧,下方可以留言我哪里有可以优化的地方,谢谢大佬们了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stall Reservations POJ - 3190 的相关文章

  • [JavaScript] 优先队列

    JavaScript 实现优先队列 代码如下 xff1a class Heap constructor cmp 61 a b 61 gt a lt b this arr 61 new Array this cmp 61 a b 61 gt
  • 优先队列(priority_queue)的妙用(以力扣周赛“K 次增加后的最大乘积”为例)

    1 priority queue的用法 优先队列在实际的动态更新过程中帮我们找到最大或者最小的元素 xff0c priority queue的使用需要先包含头文件 lt queue gt xff0c 即 include lt queue g
  • FIFO队列(First In First Out)和优先队列

    queue lt 类型名 gt q q size 返回队列中元素个数 q empty 若队列为空 xff0c 返回true xff0c 否则返回false q pop 删除队首元素 xff0c 但不返回其值 q front 返回队首元素的值
  • 区间图着色问题

    这是算法导论贪心算法一章的一个习题 题目描述 假定有一组活动 我们需要将它们安排到一些教室 任意活动都可以在任意教室进行 我们希望使用最少的教室完成所有的活动 设计一个高效的贪心算法求每个活动应该在哪个教室进行 这个问题称为区间图着色问题
  • 【NOIP 2004 提高组】合并果子

    题就自己找啦 各大OJ上应该都有 题目 题目描述 在一个果园里 多多已经将所有的果子打了下来 而且按果子的不同种类分成了不同的堆 多多决定把所有的果子合成一堆 每一次合并 多多可以把两堆果子合并到一起 消耗的体力等于两堆果子的重量之和 可以
  • Array merging

    Array merging 题意 给出两个长度为n的数组a b 现在每次可以取出任意一个数组的第一个元素 放到c数组的后面 c数组一开始为空 求c数组连续相等的最长子串长度 思路 这里可以用两个map把a b数组每个元素对应的连续相等的最长
  • 第十三届蓝桥杯C B组 J:砍竹子

    思路 首先看数据范围 2e5 比较大 而且有一个不变的是 我们每次都从最高的竹子区间开始砍 那么每进行一次砍操作 接着还得再找出最高的竹子区间 代表要有多次排序 所以自然而然想到了一个数据结构 堆 想到 堆 思路就打开了 可以用pair存高
  • Acesrc and Hunting【模拟 贪心】

    HDU 6660 题目链接 这道题主要就是讲我们从任意点出发 每次走的都是没走过并且 曼哈顿距离大于1小于3的点 然后问能不能覆盖完整幅图 这里就想到一个很经典的问题 4399小游戏除草游戏 以前玩过的一个小游戏倒是让我对这道题的解法有了方
  • 例说数据结构&STL(七)——priority_queue

    1 白话优先队列 priority queue 前面我们已经相继介绍了双向队列和FIFO特性的队列 这里我们还要接触另一个包含 队列 称呼的数据结构 优先队列 其实这三个数据结构名称看似很像 实则天差万别 通过下面的介绍你就会有很深的体会了
  • NYOJ 586 疯牛 & POJ 2456(二分搜索 + 贪心)

    疯牛 时间限制 1000 ms 内存限制 65535 KB 难度 4 描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000
  • bzoj1110 [POI2007]砝码Odw 贪心+进制拆分

    题意就不说了 一开始居然在想直接dp 看到是整数倍我的内心居然毫无波动 真是傻的不行了 因为是整数倍 那我们可以把一个容器用砝码的重量做为进制拆分 然后从小到大一个个填就可以了 贪心策略肯定是最优的 具体如何拆分看hzwer www htt
  • 多元Huffman编码问题

    题目链接 题意 最多可以让k堆合并 每一次合并的花费为河合并堆的数量 问最多和最少的花费 题解 最少的花费一定是每次合并的堆数尽可能多 这样我们就会减少前面已经合并的堆的重复计算 所以 每次合并k堆时最少 每次合并2堆时最大 另外 最少的时
  • Educational Codeforces Round 67 (Rated for Div. 2)

    contest链接 A Stickers and Toys time limit per test 2 seconds memory limit per test 256 megabytes input standard input out
  • 算法:优先队列-理论

    目录 优先队列 我们平时比较常见的优先队列的场景有什么 优先队列的实现机制 java的优先队列是怎么实现的 优先队列 我们先回忆一下什么是队列 队列 一种先进先出的数据结构 主要关注点在于先入的元素
  • [leetcode] 358. Rearrange String k Distance Apart 解题报告

    题目链接 https leetcode com problems rearrange string k distance apart Given a non empty string str and an integer k rearran
  • Codeforces 1469 F. Power Sockets —— 二分+线段树,贪心

    This way 题意 现在有一个根节点 和n条包含a i 个节点的链 一开始所有点的颜色是白色的 你每次可以做以下操作 找到树中某个白色节点 拿出一条链 将这个节点和链上某个节点连接 并且这两个点的颜色变成黑色 之后这条链属于树中一个部分
  • ACM--田忌赛马--贪心--HDOJ 1052--Tian Ji -- The Horse Racing

    HDOJ题目地址 传送门 Tian Ji The Horse Racing Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total S
  • 编程之美2015初赛第二场AB

    题目1 扑克牌 时间限制 2000ms 单点时限 1000ms 内存限制 256MB 描述 一副不含王的扑克牌由52张牌组成 由红桃 黑桃 梅花 方块4组牌组成 每组13张不同的面值 现在给定52张牌中的若干张 请计算将它们排成一列 相邻的
  • [POI2007]砝码Odw

    看这数据范围就不太可DP的样子 考虑贪心 首先注意到题目里有对于任意两个砝码其中一个是另一个质量整数倍的条件 所以砝码质量的种类不超过log INF 考虑按质量从小到大把砝码往容器里放 这样的话所有的砝码和容器的质量都可以除以当前砝码质量然
  • 八大排序算法(六)——优先队列、堆和堆排序

    6 1 API 优先队列是一种抽象数据类型 它表示了一组值和对这些值的操作 优先队列最重要的操作就是删除最大元素和插入元素 6 2 初级实现 6 2 1 数组实现 无序 或许实现优先队列最简单方法就是基于下压栈的代码 insert 方法的代

随机推荐

  • 关于软件产品化的几点思考【转】

    关于软件产品化的几点思考 转自 汉捷咨询 国内很多软件企业尤其是行业软件企业是从开发一 二个软件项目起家的 而且项目规模和复杂度也不大 依赖其中一两个高手 他们能够在客户适度满意的状态下成功完成项目 基于以往研究 成功的主要因素是项目具备以
  • 各种语言的简写代码

    中文 zh CN 英语 en 中文 繁体 zh TW 越南语 vi 阿尔巴尼亚语 sq 阿拉伯语 ar 阿塞拜疆语 az 爱尔兰语 ga 爱沙尼亚语 et 白俄罗斯语 be 保加利亚语 bg 冰岛语 is 波兰语 pl 波斯语 fa 布尔文
  • Matlab - Solidworks 机器人建模(6)——使用rigidBodyTree构建机器人模型

    前言 本文适用对象 没有机器人的Solidworks模型自己又懒得画的童鞋 没有机器人URDF模型的童鞋 如果你在Matlab帮助里面搜索rigidBody 你大概率会看到matlab自带的例程 链接在这里 教你怎么用rigidBody建立
  • 腾讯会议——录制的视频如何正常观看(转为MP4格式)

    1 打开腾讯会议 2 点击历史会议 3 点击你录制的会议 4 点击录制详情 5 点击转码 完成这5步 即可将所保存的视频转为MP4格式 便于观看
  • 游戏开发unity插件Cinemachine系列:制作摄像机沿路径移动的动画

    可以参看 https blog csdn net zhenghongzhi6 article details 104885429
  • 初级软件测试工程师需要具备那些知识与技能

    哈喽 大家好 今天我们来聊聊如何成为一名初级软件测试工程师 需要必备那些知识和技能 什么是软件测试 软件测试的经典定义是 在规定的条件下对程序进行操作 以发现程序错误 衡量软件品质 并对其是否能满足设计要求进行评估的过程 软件测试的现实定义
  • iOS安全之ipa 包重签名的3种方法

    重签名的意义 ipa 重签名最大的用处是 不必重新打包 和配置其它第三方获取 appkey 等操作 直接重签名之后依然可以拥有这些功能 更快的发布测试或者灰度版本 方法一 终端命令 sigh resign 1 明白两个东西 想要重签名的证书
  • Unity笔记--Canvas渲染

    参考 五 UGUI源码分析之Rebuild 布局重建 图形重绘 网格重建 网格重建大体包括布局重建和图形重建两部分 canvas更新过程可分为布局 渲染两部分 共六阶段 public enum CanvasUpdate Prelayout
  • C++类和对象——引用作为函数形参

    问题 1 如果函数的形参为普通函数 那么调用函数时形参对象会被构造 函数调用结束形参对象还需要被销毁 2 为了避免形参对象这种 临时对象 的创建 我们可以将形参设计成引用 着重理解下边的代码 include
  • 牛客网--HJ1 字符串最后一个单词的长度

    文章目录 前言 一 题目内容和牛客网的链接 二 话不多说 引入代码 1 引入库 2 读入数据 总结 前言 题目的分析 一 题目内容和牛客网的链接 牛客网题目链接 二 话不多说 引入代码 1 引入库 代码如下 示例 include
  • Origin常见问题

    1 在绘图时 常常移动一个图 其他的图也跟着缩放 这是由于图层关联导致 取消即可 如下 图中所示 默认是图层2关联到了图层1 所以取消关联就可以了
  • C语言数组指针和指针数组实例演示

    一 数组指针 1 简介 数组指针就是指向数组的指针 定义方式 int p len NULL 示例 include
  • 使用RabbitMQ实现延时队列

    之前公司是一个类电商公司 会有用户下单后未支付取消订单的场景 解决方案是使用RabbitMQ的死信队列来实现一个延时队列 下单时 将订单丢进消息队列 设置过期时间 订单失效时间 然后到时候检查订单状态 如果未支付则取消订单 1 什么是死信
  • 【LeetCode】345. 反转字符串中的元音字母

    题目 给你一个字符串 s 仅反转字符串中的所有元音字母 并返回结果字符串 元音字母包括 a e i o u 且可能以大小写两种形式出现 示例 1 输入 s hello 输出 holle 示例 2 输入 s leetcode 输出 leotc
  • odoo连接器-odoo数据拉取,Java xml-rpc实现

    背景 odoo数据拉取 创建 更新 参考 官方external api文档 External API Odoo 14 0 文档 术语 ORM odoo数据以对象模型呈现 支持one2many many2one many2many等对象关联关
  • FSDataOutputStream 的深入分析

    对于一般文件 都有满足随机读写的api 而hadoop中的读api很简单用FSDataInputStream类就可以满足一般要求 而hadoop中的写操作却是和普通java操作不一样 在这里插入代码片 Hadoop对于写操作提供了一个类 F
  • 刷脸支付服务商重金之下必有勇夫

    为了吸引消费者使用刷脸支付 而非扫码 支付宝和微信会给消费者提供优惠 比如在店里面使用刷脸会有随机立减 打折活动 而扫码则没有 这只是给消费者的补贴 以利益吸引商家与推广人员加入刷脸支付同样重要 显然 与二维码支付的几乎没有成本不同 刷脸支
  • C++全局变量的声明和定义

    参考 http wrchen blog sohu com 71617539 html 1 编译单元 模块 在VC或VS上编写完代码 点击编译按钮准备生成exe文件时 编译器做了两步工作 第一步 将每个 cpp c 和相应的 h文件编译成ob
  • 算法学习:插值型求积公式

    算法学习 插值型求积公式 牛顿 柯斯特 Newton Cotes 求积公式 定义 牛顿 柯斯特 Newton Cotes 求积公式是插值型求积公式的特殊形式 在插值求积公式 baf x dx baP x dx k 0nAkf xk a b
  • Stall Reservations POJ - 3190

    这道题 是学长给我们布置的学习用的题目 重在给我们讲解了什么是优先队列以及其对应的贪心问题 好了 先送上 中文翻译过的题意 手动 滑稽 Oh those picky N 1 lt N lt 50 000 cows They are so p