当前位置: 首页 > news >正文

【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)

http://www.cnnetsun.cn/news/70034.html

相关文章:

  • 整体设计 之28 整体设计 架构表表述总表的 完整程序(之27 的Q268 )(codebuddy)
  • 云手机 实体手机的云端延伸
  • 交换机和网卡的 PFC 机制工作原理与实例解析
  • UI自动化测试常见面试题
  • Linux OOM 问题之 DMSERVER 受害者
  • Flutter引擎裁剪与鸿蒙方舟编译协同优化
  • STM32CubeMX的main.c开头介绍
  • 26.MPSOC FPGA linux读AHT20传感器
  • 嵌入式系统时序图完全指南:从原理到实战
  • 小团队与大团队的管理差异
  • [CISCN2019 华东南赛区]Web4
  • AI编程革命!Claude Skills大揭秘:小白也能快速上手的Agent开发神器,大模型开发者必看!
  • 内点法求最优潮流附matlab代码
  • 三相PWM整流器有限集模型预测电流控制附Simulink仿真模型
  • 光伏四可“可观”功能:光伏电站全景数字化的底层支撑技术
  • 如何用FLUX.1-dev镜像在本地部署下一代AI绘画模型?
  • 基于 Comsol 移动网格方法的激光熔池流动数值模拟
  • BLDC无刷直流电机Matlab仿真:转速电流双闭环控制及有感无感换相方式研究
  • [光学原理与应用-491]:水冷机、零气模块CDA、功率计等影响266皮秒紫外激光器的种子源1064nm功率稳定性结果的主要因素有哪些?
  • 昆仑通态MCGS与欧姆龙E5CC温控器通讯实战:PID模式及输出启停控制
  • 通达信〖逆势突破强牛〗指标公式 逆市环境中率先突破前期重要压力位 较强内在上涨动力
  • 基于扰动观测器的永磁同步电机(PMSM)模型预测控制(MPC)仿真探索
  • AEB联合仿真算法设计:Carsim2019.0+Matlab/Simulink2021a实现...
  • Java毕设选题推荐:基于springboot个人博客系统的设计与实现基于SpringBoot+Vue个人博客系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot停车场车位预约系统基于Java springboot停车场管理系统停车位预约【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot的无人化、线上化、数据化海洋馆预约系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Ascend C高级API应用:InitGlobalMemory与Pad操作的底层原理
  • Java毕设选题推荐:基于Java Web的新能源汽车信息咨询服务基于SpringBoot+Vue的新能源汽车信息咨询服务的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:OPA 集成指南:从原理到实践
  • Object.defineProperty和Proxy实现拦截的区别