题目背景
玛雅人预言的世界末日没有发生,我们迎来了地球的第五个太阳纪。
学校将要举办第五个太阳纪的第一次元旦晚会。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复制
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
题解
所有节目有a开始,b结束,c人数
把所有节目按a从小到大排
每次先遍历【a,b】计算缺的人数
如果缺,你们从【a,b】的后面开始选人
→这样就可以保证每次后面选的人最少←
#include <bits/stdc++.h> using namespace std; const int N=3e5+10; struct Stu{ int a,b,c; }; Stu stu[N]; bool cmp(Stu a,Stu b){ if(a.b!=b.b) return a.b<b.b; else a.a<b.a; } int n,m,hav[N],ans; int main(int argc, char** argv) { cin>>n>>m; for(int i=0;i<m;i++){ cin>>stu[i].a>>stu[i].b>>stu[i].c; } sort(stu,stu+m,cmp); for(int i=0;i<m;i++){ int cnt=0; for(int j=stu[i].a;j<=stu[i].b;j++){ if(hav[j]) cnt++; } if(cnt<stu[i].c){ for(int j=stu[i].b;j>=stu[i].a&&cnt<stu[i].c;j--){ if(!hav[j]) hav[j]=1, cnt++,ans++; } } } cout<<ans; return 0; }