元旦晚会
题目背景
玛雅人预言的世界末日没有发生,我们迎来了地球的第五个太阳纪。
学校将要举办第五个太阳纪的第一次元旦晚会。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;
}