畜栏保留问题

1|0题目描述

农场有 NNN 头牛,每头牛会在一个特定的时间区间 [A,B][A, B][A,B] (包含 AAA 和 BBB ) 在畜栏里挤奶,且一个畜栏里同时只能有一头牛在挤奶。现在农场主希望知道最少几个畜栏能满足上述要求, 并要求给出每头牛被安排的方案。对于多种可行方案,输出一种即可。

2|0输入

输入的第一行包含一个整数 NNN (1≤N≤500001 \le N \le 500001N50000), 表示有 NNN 牛头; 接下来 NNN 行每行包含两 个数,分别表示这头牛的挤奶时间 [Ai,Bi]\left[A_i, B_i \right][Ai,Bi] (1≤A≤B≤10000001 \le A \le B \le 10000001AB1000000) 。

3|0输出

输出的第一行包含一个整数,表示最少需要的畜栏数:接下来 NNN 行,第 i+1i + 1i+1 行描述第 iii 头牛被分配的畜栏编号(从 111 开始)。

4|0输入输出样例

4|1样例输入 #1

5 1 10 2 4 3 6 5 8 4 7

4|2样例输出 #1

4 1 2 3 2 4
复制代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node 4 { 5 int st,ed,num; 6 bool operator<(const node&w)const{ 7 return st<w.st; 8 } 9 }cow[100010]; 10 int n,res,tmp[1000010]; 11 int main() 12 { 13 cin>>n; 14 for(int i=0;i<n;i++) cin>>cow[i].st>>cow[i].ed,cow[i].num=i+1; 15 sort(cow,cow+n); 16 set<pair<int,int>>que;//使用set去重 17 for(int i=0;i<n;i++) 18 { 19 que.insert({cow[i].ed,cow[i].num}); 20 pair<int,int> now=*que.begin();//注意set用法,返回的是地址,所以要加*变成值 21 if(cow[i].st>now.first) { 22 que.erase(now); 23 tmp[cow[i].num]=tmp[now.second]; 24 } 25 else tmp[cow[i].num]=++res; 26 } 27 cout<<que.size()<<endl; 28 for(int i=0;i<n;i++) cout<<tmp[i+1]<<endl; 29 return 0; 30 }
复制代码

 

 

__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/17455611.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
-- --
点击右上角即可分享
微信分享提示