首页 > 其他分享 >【NC23036】华华听月月唱歌

【NC23036】华华听月月唱歌

时间:2024-03-29 10:30:22浏览次数:12  
标签:return 华华 int NC23036 端点 区间 最优 排序 唱歌

题目

华华听月月唱歌

区间合并(注意边界),贪心

思路

贪心的区间合并

因为是区间合并,所以我们先将区间从小到大排序,以方便合并,排序的时候还是按照区间左端点从小到大排序就行了。排好序之后我们得到类似下面这样的区间段:
在这里插入图片描述

由于只是按左端点从小到大排序,所以当左端点相同时,右端点不一定会有序

怎么贪心呢?

首先先找第一个“最优”的区间 a a a,即左端点最小时右端点最大的区间,并记录右端点的值 r r r,然后遍历 a a a 之后的区间,如果可以与 a a a 接上,则寻找这些能与 a a a 接上的所有区间中的最优区间(即右端点最大),然后更新 r r r 的值和答案值。

怎么寻找第一个最优区间?

可以知道的是,仅仅按左端点从小到大排序后,第一个区间并不一定是第一个最优区间,如上图(第二个才是),所以还得单独寻找第一个最优区间,这样代码显得臃肿。所以不如直接按“如果左端点不同,则按左端点从小到大排序,如果左端点相同,则按右端点从大到小排序”,这样的话,排好序之后的第一个区间一定是第一个最优区间。

在最后,如果所有区间都遍历完了,就看此时的 r r r 满不满足大于等于题目给定的 n n n,如果满足则说明应该返回答案,如果不满足则返回 − 1 -1 −1。此外,在排好序之后还应该检查一下第一个区间左端点(即区间左端点的最小值)满不满足小于等于 1 1 1 的条件,如果最小的区间左端点都大于 1 1 1 了,那么说明再怎么也不能满足题意,直接返回 − 1 -1 −1,就不用再进行后续操作了。

代码

#include <stdio.h>
#include <stdlib.h>

/**
 * @brief 自定义排序,以左端点从小到大排序,如果左端点相同则右端点从大到小排序
 *
 * @param a
 * @param b
 * @return int
 */
int cmp(const void* a, const void* b) {
    int(*aa)[2] = (int(*)[2])a;
    int(*bb)[2] = (int(*)[2])b;
    if ((*aa)[0] == (*bb)[0]) return (*bb)[1] - (*aa)[1];
    return (*aa)[0] - (*bb)[0];
}

int main(void) {
    int n = 0, m = 0;
    scanf("%d%d", &n, &m);
    int a[m][2], i = 0;
    for (; i < m; i++) {
        scanf("%d%d", &a[i][0], &a[i][1]);
    }
    qsort(a, m, sizeof(int[2]), cmp);
    // 注意题目的测试用例似乎没有包含最小的 L 大于 1
    // 的情况,所以下面这个判断可以不加,之后加不加就不知道了
    if (a[0][0] > 1) {
        printf("-1\n");
        return 0;
    }
    // 根据排序规则,我们可以知道排好序之后的第一个区间是最优的
    int ans = 1, r = a[0][1], t = r;
    i = 1;
    // 然后遍历其余区间
    while (i < m) {
        // 假设已经完成拼接或者已经不合法,则退出循环
        if (r == n || a[i][0] > r + 1) break;
        // 寻找下一段中最长的区间
        while (i < m && a[i][0] <= r + 1) {
            if (a[i][1] > t) t = a[i][1];
            i++;
        }
        // 更新区间右端点和答案
        r = t;
        ans++;
    }
    // 最后的答案根据最终拼接的区间右端点的大小确定
    printf("%d\n", r < n ? -1 : ans);
    return 0;
}

标签:return,华华,int,NC23036,端点,区间,最优,排序,唱歌
From: https://blog.csdn.net/m0_52319522/article/details/137120142

相关文章

  • 【NC23046】华华教月月做数学
    题目华华教月月做数学考虑数据溢出的问题思路题目要求很简单,就是算aaa的bb......
  • 想用手机做ai短视频的ai短视频伙伴快看看,这款app可以让你的图片唱歌,说话,对口型最好的a
    经常看到很多ai短视频伙伴过来问,你这里有没有手机可以用的ai短视频工具,说实话到目前为止,手机能够使用的ai工具真的非常少,高粱seo记得仅仅有一款做水流瀑布流动类的app,之前很多人在直播间搞培训用的,因为涉及到ai方面的工具,一般来说消耗资源比较大,一般电脑用起来都费劲,更别说手......
  • STM32实现无源蜂鸣器唱歌
    记录学习stm32中实现小demo所涉及到的知识点一、蜂鸣器发声原理蜂鸣器分为有源和无源两种。所谓的源,指的是其中内部的振荡源,有源蜂鸣器中的振荡器一般是[[多谐振荡器]],其原理就是模拟电路中RC振荡器的一般原理(放大电路、正反馈、相位差90°、稳压电路),有源蜂鸣器内部的振荡源频......
  • NC23051 华华和月月种树
    题目链接题目题目描述华华看书了解到,一起玩养成类的游戏有助于两人培养感情。所以他决定和月月一起种一棵树。因为华华现在也是信息学高手了,所以他们种的树是信息学意义下的。华华和月月一起维护了一棵动态有根树,每个点有一个权值。刚开存档的时候,树上只有0号节点,权值为0......
  • 唱歌教程
    除非你想要你的嗓音惊艳所有人,否则就不要联系我并学习唱歌教程除非你想要掌握歌唱中的所有的唱歌技巧和发声方法,否则就不要联系我并学习唱歌教程除非你想要改掉用喉咙唱歌坏习惯,成为ktv麦霸,否则就不要联系我并学习唱歌教程除非你想要改变自己五音不全,不会唱歌的问题,否则就不要......
  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法
    DAY10共2题:月月给华华出题华华给月月出题难度较大。......
  • LiveVISGAT1400视图库服务-支持海康大华华为宇视天地伟业等设备视图库接入使用说明
    @目录LiveVISGAT1400视图库服务安装使用说明1、服务说明1.1、安装包说明1.2、视图库服务1.3、配置视图库服务参数2、服务运行2.1、Windows2.2、Linux3、配置设备接入3.1、海康视图库接入示例3.2、大华视图库接入示例4、平台使用4.1、管理平台4.2、接口文档5、统一编码规则6、Live......
  • 【计蒜课 每周三题】2023-02-25 唱歌
    唱歌题目描述ame是一个可爱的女孩子,她想要唱歌。一共有\(n\)首歌,第\(i\)首歌的长度\(a_i\),同时唱第\(i\)首歌的满意值为\(b_i\)。ame喜欢的歌满足\(a_i\leq......
  • 牛客小白月赛12 -- E 华华给月月准备礼物 (二分)
     题目描述二月中旬虐狗节前夕,华华决定给月月准备一份礼物。为了搭建礼物的底座,华华需要若干根同样长的木棍。华华手头上有一些长度参差不齐的木棍,他想将每根都裁剪成若干......
  • 牛客小白月赛12 -- B 华华教月月做数学
     题目描述找到了心仪的小姐姐月月后,华华很高兴的和她聊着天。然而月月的作业很多,不能继续陪华华聊天了。华华为了尽快和月月继续聊天,就提出帮她做一部分作业。月月的其中......