news 2026/8/27 19:23:04

【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/8/27 14:35:51

云手机 实体手机的云端延伸

云手机可视为实体手机的云端延伸。它基于云计算技术和虚拟化技术&#xff0c;在云端服务器上虚拟出带有原生安卓等操作系统的手机实例&#xff0c;通过网络与实体设备连接&#xff0c;用户可通过实体手机、平板或电脑等设备远程操控云手机&#xff0c;实现诸如运行应用、游戏等…

作者头像 李华
网站建设 2026/8/27 11:41:02

交换机和网卡的 PFC 机制工作原理与实例解析

PFC&#xff08;Priority-based Flow Control&#xff0c;基于优先级的流控&#xff09; 是数据中心以太网&#xff08;如 RoCE v2、DCB&#xff09;的核心技术&#xff0c;属于链路层&#xff08;Layer 2&#xff09;流量控制机制。其核心目标是解决拥塞导致的丢包问题—— 通…

作者头像 李华
网站建设 2026/8/27 14:29:30

UI自动化测试常见面试题

1、什么是UI自动化测试&#xff1f; UI自动化测试是一种通过模拟用户交互并自动执行UI操作的软件测试方法。它用于验证用户界面的功能和稳定性&#xff0c;以确保在不同的操作系统、浏览器和设备上的一致性。 2、UI自动化测试的优势和劣势是什么&#xff1f; 优势&#xff1…

作者头像 李华
网站建设 2026/8/27 11:29:03

Linux OOM 问题之 DMSERVER 受害者

Shell 脚本模拟(无需安装工具) OOM 问题#!/bin/bash #持续申请内存&#xff0c;每次申请 100MB&#xff0c;直到内存耗尽。while true; do # 创建 100MB 临时文件&#xff0c;读取到内存(cat 命令会占用内存)。cat /dev/zero |head -c 100M |tail & done运行脚本&#xff1…

作者头像 李华
网站建设 2026/8/26 17:29:50

Flutter引擎裁剪与鸿蒙方舟编译协同优化

欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 Flutter引擎裁剪与鸿蒙方舟编译协同优化 Flutter引擎的冗余模块会增加包体积并影响启动速度。通过分析flutter_engine源代码&#xff0c;可识别非必要模块进行裁剪。常见可移除模块包括&#…

作者头像 李华