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

csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法

csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法

题目描述

cjwssb 知道是误会之后,跟你道了歉。你为了逗笑他,准备和他一起开始魔法。不过你的时间不多了,但是更惨的是你还需要完成n nn个魔法任务。假设你当前的时间为T TT,每个任务需要有一定的限制t i t_iti表示只有当你的T TT严格大于t i t_iti时你才能完成这个任务,完成任务并不需要消耗时间。当你完成第i ii个任务时,你的时间T TT会加上b i b_ibi,此时要保证T TT在任何时刻都大于0 00,那么请问你是否能完成这n nn个魔法任务,如果可以,输出+1s \texttt{+1}\texttt{s}+1s,如果不行,输出-1s \texttt{-1}\texttt{s}-1s

输入格式

第一行:一个整数Z ZZ,表示有Z ZZ个测试点。

对于每个测试点:

第一行:两个整数n , T n,Tn,T,表示有n nn个任务,你一开始有T TT的时间。

接下来n nn行,每行2 22个数字,t i t_itib i b_ibi

输出格式

对于每个测试点,输出+1s \texttt{+1}\texttt{s}+1s或者-1s \texttt{-1}\texttt{s}-1s

输入输出样例 1
输入 1
1 2 13 1 -9 5 -3
输出 1
+1s
说明/提示

对于20 % 20\%20%的数据,n ≤ 10 n\leq10n10

对于100 % 100\%100%的数据,n ≤ 10 5 , Z ≤ 10 , t i ≤ 10 5 , T ≤ 10 5 , − 10 5 ≤ b i ≤ 10 5 n\leq10^5,Z\leq10,t_i\leq10^5,T\leq10^5,-10^5\leq b_i\leq 10^5n105,Z10,ti105,T105,105bi105

思路分析

本题要求在初始时间 T 下,按一定顺序完成 n 个任务,每个任务有门槛t i t_iti(需T > t i T > t_iT>ti)和收益b i b_ibi(可为负)。完成所有任务后输出+1s,否则输出-1s

关键贪心策略

  1. 将任务分为两组:

    • b i ≥ 0 b_i \ge 0bi0的“正收益”任务
    • b i < 0 b_i < 0bi<0的“负收益”任务
  2. 正收益任务:按t i t_iti升序处理。
    因为门槛越低越容易满足,且完成后续时间增加,有利于后续任务。

  3. 负收益任务:按t i + b i t_i + b_iti+bi降序处理。
    推导:对于两个负收益任务 (i, j),先做 i 再 j 的所需最小初始时间为max ⁡ ( t i , t j − b i ) \max(t_i, t_j - b_i)max(ti,tjbi),先 j 后 i 为max ⁡ ( t j , t i − b j ) \max(t_j, t_i - b_j)max(tj,tibj)
    t i + b i > t j + b j t_i + b_i > t_j + b_jti+bi>tj+bj,则max ⁡ ( t i , t j − b i ) ≤ max ⁡ ( t j , t i − b j ) \max(t_i, t_j - b_i) \le \max(t_j, t_i - b_j)max(ti,tjbi)max(tj,tibj),即先 i 更优。
    因此按t i + b i t_i + b_iti+bi从大到小排序。

  4. 处理过程中时刻保证 (T > 0),且在完成负收益任务后需重新检查 (T > 0)(因为b i < 0 b_i < 0bi<0可能使时间降至非正)。

复杂度
排序O ( n log ⁡ n ) O(n \log n)O(nlogn)

代码实现

#include<bits/stdc++.h>usingnamespacestd;structnode{//任务结构体intt,b;//门槛t,收益b};intZ,n;//Z测试点个数,n任务数longlongT;//当前时间,用long long防止正收益累加溢出node pos[100005],neg[100005];//正收益任务数组,负收益任务数组intcp,cn;//正收益任务个数,负收益任务个数intmain(){scanf("%d",&Z);//读入测试点个数while(Z--){//循环每个测试点scanf("%d%lld",&n,&T);//读入n和初始时间T(注意%lld对应long long)cp=cn=0;//清空计数器for(inti=0;i<n;++i){//读入n个任务intt,b;scanf("%d%d",&t,&b);if(b>=0)pos[cp++]={t,b};//正收益存入pos数组elseneg[cn++]={t,b};//负收益存入neg数组}//正收益任务按门槛t升序排序sort(pos,pos+cp,[](node x,node y){returnx.t<y.t;});//负收益任务按(t+b)降序排序,贪心最优顺序sort(neg,neg+cn,[](node x,node y){returnx.t+x.b>y.t+y.b;});boolok=true;//标记是否可行//先处理所有正收益任务for(inti=0;i<cp;++i){if(T<=pos[i].t){//当前时间不大于门槛,无法完成ok=false;break;}T+=pos[i].b;//完成正收益任务,时间增加}if(!ok){//若正收益阶段已失败printf("-1s\n");//输出-1s并跳过负收益处理continue;}//再处理所有负收益任务for(inti=0;i<cn;++i){if(T<=neg[i].t){//门槛不满足ok=false;break;}T+=neg[i].b;//完成负收益任务,时间减少if(T<=0){//完成之后时间必须大于0ok=false;break;}}//根据ok输出结果printf(ok?"+1s\n":"-1s\n");}return0;}

功能分析

  • 静态数组:用全局pos[100005]neg[100005]存储任务,分别记录数量cp, cn,避免使用vector
  • 分组排序:根据b的正负分别存入数组,并按贪心策略排序。
  • 模拟执行:先做所有正收益任务,再做负收益任务。过程中任何门槛不满足或时间 ≤0 则失败。
  • 输出:通过所有任务输出+1s,否则-1s

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转

4、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
http://www.jsqmd.com/news/684367/

相关文章:

  • hot100 114.二叉树展开为链表
  • 软考架构师【第十一章】未来信息综合技术
  • 忍者像素绘卷多场景落地:电竞战队像素风应援物智能生成系统
  • 如何在 Firebase Storage 中批量获取所有媒体文件的下载链接
  • 从 Hello World 到消息队列:用 ZeroMQ 和 C++ 在 Ubuntu 上快速搭建你的第一个分布式应用原型
  • 给您的“空中哨兵”做个大保养!大疆机场2年度保养指南请收好
  • 为什么92%的.NET开发者在AI推理中误用ThreadPool?——.NET 11新引入ParallelForAsync与AI Pipeline调度深度解析
  • Web 前端工程师面试题 + 参考答案
  • ArcMap处理不规则遥感影像:从按掩膜提取到镶嵌,手把手教你搞定行政区划裁剪与拼接
  • 2.大模型微调难点与挑战
  • 用Python+Floyd算法复刻2000年数模B题:从钢管运输到物流成本最优化的实战解析
  • FLUX.1-dev-fp8-dit文生图惊艳案例分享:FP8模型生成的中国风/赛博朋克/蒸汽波风格图
  • 前端开发者构建AI应用实战指南
  • 《JAVA面经实录》- 权限管理框面试题
  • 如何用AutoLegalityMod插件3分钟生成100%合法的宝可梦数据
  • 【Excel提效 No.011】一句话搞定多工作表纵向合并
  • Layui表格怎么实现在表头的右侧添加一个自定义配置图标
  • 支付机构必看:网联平台RCMP前置系统实战解析,从映射额度到结算的完整避坑指南
  • Python与OpenAI API实战:快速构建AI对话服务
  • 2026届学术党必备的六大AI学术神器解析与推荐
  • 算法训练营第七天 | 环形链表 扭捏快指针步步退,霸道慢指针狠狠追
  • Peer-Link断了怎么办?一次生产环境M-LAG故障排查与恢复实录
  • Layui如何实现表格内部的图片点击后进入相册轮播模式
  • Android 本地音乐播放(读取系统媒体库 + MediaPlayer)
  • 从5G回看通信原理:那些课本上的概念(OFDM、多址、衰落)到底是怎么用的?
  • 双非跨考哈工大计算机,我是如何用CSAPP和真题啃下854专业课的?
  • 从原理到防御:深入解析泛洪攻击(Flood Attack)的攻防博弈
  • nli-MiniLM2-L6-H768在教育行业落地:学生问答自动归类与知识点匹配案例
  • 当AI的“记忆仓库“塞不下时,它们是怎么聪明腾地方的?
  • Python类方法怎么定义@classmethod与@staticmethod区别