YbtOJ 贪心算法课堂过关 例3 畜栏预定【贪心】

102 篇文章 2 订阅
11 篇文章 0 订阅

在这里插入图片描述


思路

这道题容易想到用贪心做。
首先肯定要排序,
之后会发现当一个奶牛的左区间边界大于另一个奶牛的右区间边界就可以共用一个畜栏。
这样暴力做是 O ( n 2 ) O(n^2) O(n2),发现可以用小根堆来维护右区间边界。
则时间复杂度可以优化成 O ( n log ⁡ n ) O(n\log n) O(nlogn)

C o d e Code Code

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
int anss[100010],js;
int n,ans,c;
priority_queue<int>q;
struct node
{
	int a,b[2];
}fi[1000010];
bool cmp(const node&f,const node&c)
{
	return f.a<c.a;
}
int main()
{
	cin>>n;
	for(int i=1; i<=n; i++)
	   scanf("%d%d",&fi[i].a,&fi[i].b[0]);
	sort(fi+1,fi+1+n,cmp);
	for(int i=1; i<=n; i++)
	 {
	 	fi[fi[i].b[0]].b[1]=i;  //存储位置,以便输出共用畜栏时的序号
	 	q.push(-fi[i].b[0]);
	 	if(fi[i].a<=-q.top())  //一个奶牛的左区间边界不大于另一个奶牛的右区间边界
	 	  ans++,c++,anss[++js]=c;
	 	else                   //一个奶牛的左区间边界大于另一个奶牛的右区间边界
	 	 {
	 	   anss[++js]=fi[-q.top()].b[1];
	 	   q.pop();
		 }
	 }
	cout<<ans<<endl;
	for(int i=1; i<=n; i++)
	   cout<<anss[i]<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值