2024睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u5 工作安排详解
本文参考 https://www.cnblogs.com/Kescholar/p/18306136


这一题可能对高手来说就能轻而易举的看出是个01背包,但是对于我这种小白还是要经过详细的分析才可以理解。
我们题目要求的是获得的最大报酬,题目的影响因素有三个:工作时长、工作截止时间、对应的报酬,那么怎么样合理的去安排,选什么变量来让他成为一道01背包的题呢?
对于01背包,我们知道,每个物品有各自的重量和价值,我们要在有限的背包容量下,求装入的物品最大价值,每一个我们的dp【i】【j】代表的是前i个物品,当前背包容量为j下的最优解,那么如果我们把i当成前i个工作,把j当前工作的截止时间,那么此时的dp【i】【j】就是做了i件工作,截止时间长度j下的报酬最大值,那么此时就可以模仿01背包的做法来实现了。
对于截止时间,其实就相当于背包当前的体积,我觉得很多人应该会在这里有困惑,所以应该先对截止时间排序,从小到大排完以后,再去进行dp
这是17分的版本,使用二维数组方便理解一点,但是肯定需要滚动数组,不然会卡空间
#include <bits/stdc++.h>
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct node{
int t,d,p;
};
int main()
{
//dp[i][j]代表前i个事件,截至时间为j下的最大报酬
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int dp[100][1000];
vector<node>ve(n+1);
for(int i=1;i<=n;i++) cin>>ve[i].t>>ve[i].d>>ve[i].p;
//先按照截至时间来排序,尽可能多的干更多的活
sort(ve.begin(),ve.end(),[](node x,node y){
return x.d<y.d;
});
dp[0][0]=0;//初始化
int res=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=ve[i].d;j++)
{
//如果截至时间小于干这件事的时长 说明这件事不能干
if(j<ve[i].t) dp[i][j]=dp[i-1][j];//最大报酬等于干完上一件事情的报酬
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-ve[i].t]+ve[i].p);
//同理背包
res=max(res,dp[i][j]);
}
}
cout<<res<<endl;
}
}
滚动数组就满分了
#include <bits/stdc++.h>
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct node{
int t,d,p;
};
int main()
{
//dp[i][j]代表前i个事件,花了j个时间长度
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int dp[5005]={0};
vector<node>ve(n+1);
for(int i=1;i<=n;i++) cin>>ve[i].t>>ve[i].d>>ve[i].p;
sort(ve.begin(),ve.end(),[](node x,node y){
return x.d<y.d;
});
int res=0;
for(int i=1;i<=n;i++)
{
//滚动数组确保了截止时间大于做完这件事的市场
for(int j=ve[i].d;j>=ve[i].t;j--)
{
dp[j]=max(dp[j],dp[j-ve[i].t]+ve[i].p);
res=max(res,dp[j]);
}
}
cout<<res<<endl;
}
}
2024睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u5 工作安排详解的更多相关文章
- socket编程的同步、异步与阻塞、非阻塞示例详解
socket编程的同步.异步与阻塞.非阻塞示例详解之一 分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...
- VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很常用很重要的控件.本节开始鸡啄米将为大家讲解菜单的概念及使用. 菜单简介 菜单在界面设计中 ...
- --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能
PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...
- C/C++编程笔记:C语言自增(++)和自减(--)运算符详解,笔记分享
一个整数类型的变量自身加 1 可以这样写: a = a + 1; 或者 a += 1; 不过,C语言还支持另外一种更加简洁的写法,就是: a++; 或者 ++a; 这种写法叫做自加或自增,意思很明确, ...
- 算法编程题积累(1)——网易笔试"工程师工作安排“问题
首先理解题目意思:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作.AC思路:采用暴力枚举每种可能的分配方案,子问题的解决逐步向上解决了母问题,最终原问题得解. 标程作者:NotDeep( ...
- 并发编程(六)Object类中线程相关的方法详解
一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...
- NOI / 1.2编程基础之变量定义、赋值及转换全题详解(5063字)
目录 01:整型数据类型存储空间大小 02:浮点型数据类型存储空间大小
- VS2010/MFC编程入门之三十八(状态栏的使用详解)
上一节中鸡啄米讲了工具栏的创建.停靠与使用,本节来讲解状态栏的知识. 状态栏简介 状态栏相信大家在很多窗口中都能见到,它总是用来显示各种状态.状态栏实际上也是一个窗口,一般分为几个窗格,每个窗格分别用 ...
- 2015游戏蛮牛——蛮牛杯第四届开发者大赛 创见VR未来开启报名
蛮牛杯启动了,大家开始报名! http://cup.manew.com/ 这不是一篇普通的通稿,别着急忽略它.它是一篇可以让你梦想变现的通稿! 从某一天开始,游戏蛮牛就立志要为开发者服务,我们深知这一 ...
- 国内第一本micropython的书出版《机器人Python极客编程入门与实战》
第一本micropython的书<机器人Python极客编程入门与实战>. 购买地址:https://item.taobao.com/item.htm?spm=2013.1.w4018-1 ...
随机推荐
- [转载] ABP框架理论学习之后台工作(Jobs)和后台工作者(Workers)
介绍 ABP提供了后台工作和后台工作者,它们会在应用程序的后台线程中执行一些任务. 后台工作 后台工作以队列和持续的方式在后台给一些即将被执行的任务排队.你可能因为某些原因需要后台工作,比如: 执行长 ...
- Spring源码分析基本介绍
Spring源码分析(一)基本介绍 摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 前言 作为一名开发人员,阅读源码 ...
- 《SpringBoot》自动装配原理(简单易懂)
引入 先看SpringBoot的主配置类 @SpringBootApplication public class DemoApplication{ public static void main(St ...
- UTS Open '21 P7 - April Fools
传送门 前言 本题是笔者keysky与同学yangbaich讨论+推式子一整个晚上以及讨论前ybc的一整个下午做出来的,综合起来是 \(34\) 个转移方程,对于整道题来说,贡献大抵为我 \(2\) ...
- Ping测试记录脚本
@echo off echo PingTest del PingTest_result.txt timeout /t 10 echo=> PingTest_result.txt :TEST ec ...
- 玩转云端 | 拥有HBlock这项“存储盘活绝技”,数据中心也能“热辣瘦身”!
夏天马上就要到了,"瘦身"不光是特定人群的需求,也是数据中心的需求.构建轻量化.低碳化.高性价比的新型数据中心,更有效地支撑经济社会数字化转型,已成为业界主流趋势. 如何让数据中心 ...
- Q:oracle小于1的number,不显示小数点前的0?
oracle存储number类型数字 如果数字小于1 如0.35就会存储.35 省略掉前面的数字0 方法1: oracle 数据库字段值为小于1的小数时,转换到char类型处理,会丢失小数点前面的 ...
- useradd usermod userdel passwd groupadd groupmod groupdel等命令详解
linux命令参数记忆有些模糊了,记录下.学而时习之,不亦说乎? 1.useradd命令用来建立用户帐号和创建用户的起始目录,使用权限是终极用户.创建新用户useradd,默认的用户家目录会被存放在/ ...
- kvm远程管理
列出centos7中所有的虚拟机 [root@kvm1 ~]# virsh list --all Id Name State ------------------------------------- ...
- kubesphere应用系列(一)部署NET8API
一.准备工作 1.kubesphere 2.harbor 3.net8 二.创建API应用 1.创建api应用 1.1使用命令创建应用 dotnet new webapi -n YourApiAppN ...