news 2026/4/23 13:01:25

【ACWing】110. 防晒(配数学证明)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【ACWing】110. 防晒(配数学证明)

题目地址:

https://www.acwing.com/problem/content/112/

C CC头奶牛进行日光浴,第i ii头奶牛需要m i n S P F [ i ] minSPF[i]minSPF[i]m a x S P F [ i ] maxSPF[i]maxSPF[i]单位强度之间的阳光。每头奶牛在日光浴前必须涂防晒霜,防晒霜有L LL种,涂上第i ii种之后,身体接收到的阳光强度就会稳定为S P F [ i ] SPF[i]SPF[i],第i ii种防晒霜有c o v e r [ i ] cover[i]cover[i]瓶。求最多可以满足多少头奶牛进行日光浴。

输入格式:
第一行输入整数C CCL LL
接下来的C CC行,按次序每行输入一头牛的m i n S P F minSPFminSPFm a x S P F maxSPFmaxSPF值,即第i ii行输入m i n S P F [ i ] minSPF[i]minSPF[i]m a x S P F [ i ] maxSPF[i]maxSPF[i]
再接下来的L LL行,按次序每行输入一种防晒霜的SPF和cover值,即第i ii行输入S P F [ i ] SPF[i]SPF[i]c o v e r [ i ] cover[i]cover[i]。每行的数据之间用空格隔开。

输出格式:
输出一个整数,代表最多可以满足奶牛日光浴的奶牛数目。

数据范围:
1 ≤ C , L ≤ 2500 1≤C,L≤25001C,L2500,
1 ≤ m i n S P F ≤ m a x S P F ≤ 1000 1≤minSPF≤maxSPF≤10001minSPFmaxSPF1000,
1 ≤ S P F ≤ 1000 1≤SPF≤10001SPF1000

问题等价于有若干区间,然后有若干点,这些点可能重合,当一个点落在一个区间里,这个点就能匹配一个区间。问这些点最多能匹配多少个区间。

思路是,先将区间按照右端点从小到大排序,然后遍历区间,对于每个区间,找到位置最小的点与之匹配;找不到的话,该区间就略过。

证明:假设上述方案叫A AA,另有某一个最优方案B BB不是这样操作的,我们考虑第一个选点不同的区间,设为I II。如果I IIA AA里被点x xx匹配,但是在B BB里没匹配,因为B BB是最优方案,所以x xxB BB里肯定匹配了某个区间,我们调整一下,让x xx去匹配I II,这样对于I II而言,两个方案一样了;如果I IIA AA里没匹配,但是在B BB里被x xx匹配,由于A AA是贪心策略,这是不可能的;如果I IIA AA里被x xx匹配,但是在B BB里被y yy匹配,那么y ≥ x y\ge xyx,我们在B BB里排序在I II之后的区间里找一个被x xx匹配的区间(如果不存在,那么在B BB里可以直接用x xx而不是y yy去匹配I II),设为J JJ,那么y yy一定能匹配J JJ,调整一下使得x xx匹配I IIy yy匹配J JJ。经过上面的调整,可以将两个方案调整成一样,从而贪心策略就是最优策略。

代码如下:

#include<algorithm>#include<iostream>#include<map>#include<vector>usingnamespacestd;usingPII=pair<int,int>;intc,l;vector<PII>v;map<int,int>mp;intmain(){scanf("%d%d",&c,&l);while(c--){intl,r;scanf("%d%d",&l,&r);v.push_back({l,r});}while(l--){inta,b;scanf("%d%d",&a,&b);mp[a]+=b;}sort(v.begin(),v.end(),[&](auto&p1,auto&p2){returnp1.second<p2.second;});intres=0;for(auto&p:v){intl=p.first,r=p.second;if(autoit=mp.lower_bound(l);it!=mp.end()&&it->first<=r){if(!--it->second)mp.erase(it);res++;}}printf("%d\n",res);}

时间复杂度O ( C log ⁡ ( C L ) ) O(C\log (CL))O(Clog(CL)),空间O ( L ) O(L)O(L)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:50:12

Windows剪贴板的超级增强器,提升你的工作效率

Windows剪贴板的超级增强器,提升你的工作效率 在日常的电脑操作中,复制粘贴无疑是使用频率极高的功能。然而,Windows自带的剪贴板功能却显得捉襟见肘,每次复制新内容时,旧的内容就会被无情地覆盖。这对于需要频繁切换或重复使用之前复制内容的用户来说,无疑是一个巨大的痛…

作者头像 李华
网站建设 2026/4/22 14:33:57

@AutoConfigureBefore 与 @AutoConfigureAfter

目录 1、介绍 1.1、设计目的 1.2、定义 1.3、作用域 1.4、设计限制 2、应用 2.1、使用场景 2.2、工作原理 2.3、实战示例 3、常见误区与最佳实践 3.1、最佳实践 3.2、常见误区 3.3、与其他顺序控制注解对比 前沿 控制 Spring Boot 自动配置顺序&#xff1a; “我…

作者头像 李华
网站建设 2026/4/20 17:30:02

Qt----事件简述

目录1&#xff0c;事件的概念2&#xff0c;事件循环3&#xff0c;父子控件之间事件的传递处理4&#xff0c;事件过滤器1&#xff0c;事件的概念 定义&#xff1a; 事件是应用程序内部发生的事情或应用程序需要知道的外部事件的结果。 事件和信号的区别&#xff1a; 事件是由外…

作者头像 李华
网站建设 2026/4/21 18:42:59

AXI-A7.4.3 Atomic transactions attributes

一、atomic transactions are as follows: 1. AWLEN和AWSIZE指定写数据的字节数(对于AtomicCompare需包含比较值和交换值) AWLEN(突发长度)和AWSIZE(每次传输的字节数)共同决定了原子事务中写数据的总字节数。对于大多数原子事务,这指的是操作数的大小;但对于AtomicCom…

作者头像 李华
网站建设 2026/4/23 11:10:56

内存泄漏怎么定位和解决?core dump有哪些信息?

一、为什么会内存泄漏&#xff1f;常见场景&#xff1a;音频播放反复malloc缓冲区未freeMQTT断线重连时不断分配内存呢解析JSON字符串频繁申请堆空间回调注册后未注销导致上下文无法释放使用全局链表或队列但不清除节点二、如何定位内存泄漏&#xff1f;1、添加内存监控接口在T…

作者头像 李华
网站建设 2026/4/23 1:00:45

STL deque 的详细特征

STL deque 的详细特征 基本特性 #include <deque> using namespace std;deque<int> dq; // 声明一个int类型的双端队列 双端队列&#xff1a;允许在两端进行高效插入和删除动态数组&#xff1a;支持随机访问&#xff0c;可以像数组一样通过下标访问内存结构&a…

作者头像 李华