news 2026/6/17 15:03:42

【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/6/14 7:35:41

分布式消息队列kafka【三】—— 生产者进阶提升

分布式消息队列kafka【三】—— 生产者进阶提升 文章目录 分布式消息队列kafka【三】—— 生产者进阶提升kafka生产者发送消息源码分析kafka生产者发送消息最佳实战topic常量生产者消费者 kafka生产者重要参数讲解对于这部分常见面试题 kafka生产者和消费者拦截器实现topic常量…

作者头像 李华
网站建设 2026/6/15 20:16:36

基于FLUX.1-dev的文生图技术博客:提升提示词遵循度的秘诀

基于FLUX.1-dev的文生图技术&#xff1a;如何让AI真正“听懂”你的每一句话 在如今的生成式AI浪潮中&#xff0c;我们早已习惯了输入一段文字&#xff0c;几秒后便收获一幅惊艳图像。但你是否也遇到过这样的情况——明明写得清清楚楚&#xff1a;“一只戴着墨镜的柯基狗站在滑板…

作者头像 李华
网站建设 2026/6/10 12:49:48

Postman脚本批量转接口自动化用例

部署运行你感兴趣的模型镜像一键部署 作者之前已经开发了一个生成接口用例的工具 - API接口用例生成器&#xff0c;即将现有的 Postman 脚本转化为接口用例。本篇介绍另一款最近刚开发并项目落地的工具&#xff0c;将 Postman 的 json 脚本文件可以批量转换生成接口用例 - API…

作者头像 李华
网站建设 2026/6/15 11:41:31

线性表之链式栈

插入操作和删除操作均在链表头部进行&#xff0c;链表尾部就是栈底&#xff0c;栈顶指针就是头指针不需要预先分配固定大小动态增长和收缩typedef int data_t ; /*定义栈中数据元素数据类型*/ typedef struct node_t {data_t data ; /*数据域*/struct node_t *ne…

作者头像 李华