元旦晚会(贪心)

元旦晚会

题目背景

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

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

题目描述

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

Brett 班的同学分成了 m m m 个声部,一个声部由连续的同学组成,第 i i i 个声部由 a i a_i ai b i b_i bi 之间的同学组成(包括 a i a_i ai b i b_i bi

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

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

输入格式

第一行 2 2 2 个正整数 n , m n,m n,m

以下 m m m 行,每行 3 3 3 个正整数 a i , b i , c i a_i, b_i, c_i ai,bi,ci

输出格式

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

样例 #1

样例输入 #1

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

样例输出 #1

6

提示

对于 100 % 100\% 100% 的数据,保证 n ≤ 30000 n \le 30000 n30000 m ≤ 5000 m \le 5000 m5000 1 ≤ a i < b i ≤ n 1 \le a_i < b_i \le n 1ai<bin c i ≤ b i − a i + 1 c_i \le b_i - a_i + 1 cibiai+1

思路

你不发现这道题很像我之前写的:序列。

代码

/*
1 2 3 4 5 6 7 8 9 10
      |-|
       1
         |-|
          1 
           |--------|
                3
            |------|
                3
        
最短长度就是 5 6 7 8

贪心策略:尽量在交界地方放元素,保证元素的总个数最少
所以我们对左端点进行排序
*/

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 3e5+10;

struct E{
    int x,y,w;
    bool operator<(const E& t)const{
        return x<t.x;
    }
}e[N];
int n,m;
int ans,cnt;
bool st[N];

int main(){
    cin>>m>>n;
    
    for(int i=1;i<=n;i++){
        cin>>e[i].x>>e[i].y>>e[i].w;
    }
    
    sort(e+1,e+1+n);
    
    for(int i=n;i>=1;i--){
        // cout<<e[i].x<<" "<<e[i].y<<endl;
        cnt=0;//代表现在区间内已经有cnt个数了
        for(int j=e[i].y;j>=e[i].x;j--){//统计之前已有数的个数。
            if(st[j]){
                cnt++;
            }
        }
        
        if(cnt>=e[i].w)continue;//如果已经满足这个区间的约束,那么就不用再加了,开始看下一个区间
        
        for(int j=e[i].x;j<=e[i].y;j++){
            if(!st[j]){
                cnt++;
                ans++;
                st[j]=true;
                if(cnt>=e[i].w)break;
            }
        }
        
    }
    
    cout<<ans;
    
    return 0;
}
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

green qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值