【洛谷】P1986 元旦晚会

元旦晚会

题目背景

玛雅人预言的世界末日没有发生,我们迎来了地球的第五个太阳纪。

学校将要举办第五个太阳纪的第一次元旦晚会。Brett的班级要参加,并且还表演节目。

题目描述

Brett 班的节目是这样的:全班 n个同学排成一排,同学们手拿话筒,齐唱《喜洋洋与灰太狼》。(这个节目看起来有点二) 。

Brett班的同学分成了m个声部,一个声部由连续的同学组成,第i个声部由a[i]到b[i]之间的同学组成(包括a[i] b[i])

但是一个同学有可能同时属于多个声部,且有可能有同学不属于任何一个声部。 为了保证演唱效果,第 i 个声部必须至少有c[i]个同学持有话筒。(即第i个声部持有话筒的同学数大于等于 c[i])

请你算出Brett班最少需要几个话筒。

输入格式

第一行 2 个正整数 n,m

以下m行,每行3个正整数 a[i] b[i] c[i]

输出格式

一个正整数 满足要求的最少话筒数

样例 #1

样例输入 #1

11 5 
3 7 3 
8 10 3 
6 8 1 
1 3 1 
10 11 1

样例输出 #1

6

提示

n<=30000 m<=5000

1≤a[i]<b[i]≤n ;c[i]≤b[i]-a[i]+1

思路

考察贪心区间,将每个声部按照最右端位置从小到大排序,每个声部都是从右往左给话筒,这样可以保证话筒最少

代码

#include<bits/stdc++.h>
using namespace std;
struct voicelayer{
	int start;
	int end;
	int c;
};
bool cmp(voicelayer a,voicelayer b)
{
	return a.end<b.end;
}
int main()
{
	int n,m; cin>>n>>m;
	bool man[n];
	memset(man,0,sizeof(man));
	struct voicelayer layer[m];
	for(int i=0;i<m;i++)
	{
		cin>>layer[i].start>>layer[i].end>>layer[i].c;
	}
	sort(layer,layer+m,cmp);
	for(int i=0;i<m;i++)
	{
		int mp=0;          //each layer's mouthpieces
		for(int j=layer[i].end-1;j>=layer[i].start-1;j--)
		{
			if(man[j])
			mp++;
		}
		if(mp>=layer[i].c)
			continue;
		for(int j=layer[i].end-1;j>=layer[i].start-1;j--)
		{
			if(man[j]==0&&mp<layer[i].c)
			{
				mp++;
				man[j]=1;
			}
		}	
	}
	int mps=0;  //total mouthpieces
	for(int i=0;i<n;i++)
	{
		if(man[i])
		mps++;
	}
	cout<<mps;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值