首页 > 编程语言 >2024睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u5 工作安排详解

2024睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u5 工作安排详解

时间:2024-09-22 20:36:25浏览次数:1  
标签:node 背包 ve CAIP u5 int 01 RC dp

本文参考 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; 
		
	}	
		
		
	
	
}

标签:node,背包,ve,CAIP,u5,int,01,RC,dp
From: https://www.cnblogs.com/swjswjswj/p/18423806

相关文章

  • Codeforces Round 974 (Div. 3)
    CodeforcesRound974(Div.3)A-RobinHelps按题目要求一步步计算就行#include<bits/stdc++.h>usingnamespacestd;intn,k;voidsolve(){ cin>>n>>k; intsum=0,num,ans=0; for(inti=1;i<=n;++i){ cin>>num; if(num&g......
  • Codeforces Round 974 (Div. 3)
    A.RobinHelps模拟即可。B.RobinHoodandtheMajorOak注意到\(i^i\equivi\pmod2\),因此\(\sumi^i\equiv\sumi\pmod2\)。等差数列求和即可。C.RobinHoodinTown二分答案即可。D.RobertHoodandMrsHood枚举区间\([l,l+d-1]\)。此时我们需要快速......
  • sprintf_s strcat_s
    strcat_s函数原理:dst内存空间大小=目标字符串长度+原始字符串场地+‘\0’;获取内存空间大小使用sizeof函数(获取内存空间大小);获取字符串长度使用strlen函数(查字符串长度charsrc[1024]={"C/C++教程-strcat_s函数"};chardst[1024]={"www.codersrc.com"};//注意:str......
  • spring boot 项目中集成使用 Elasticsearch
    目录前言一、添加依赖二、配置Elasticsearch三、定义实体和仓库四、使用Elasticsearch五、性能和安全优化六、监控和日志七、插件和扩展总结前言在SpringBoot项目中使用Elasticsearch,可以充分发挥Elasticsearch在全文搜索、日志分析、数据索引等方面的......
  • 再见了 Elasticsearch!新开源自带UI,更简单更兼容,这款工具牛逼了!(带私活源码)
     今天给大家分享的是一款基于全文搜索的搜索引擎---ZincSearch!对于 Elasticsearch 用过的人都很熟悉了,主要做文本搜索,而且响应速度在毫秒级,应用场景非常广泛。比如:全文搜索、日志分析、运维监控、安全分析和电商搜索等等。既然Elasticsearch这么好用,那为什么会出现Zinc......
  • Flink数据源拆解分析(WikipediaEditsSource)
    在demo中,WikipediaEditsSource类作为数据源负责向Flink提供实时消息,今天咱们一起来分析其源码,了解Flink是怎么获取到来自Wiki的实时数据的,这对我们今后做自定义数据源也有很好的参考作用;官方解释以下是官网对消息来源的说明,维基百科提供了一个IRC协议的通道,从这个通道可以获取对......
  • 我的网站集成ElasticSearch初体验
      最近,我给我的网站(https://www.xiandanplay.com/)尝试集成了一下es来实现我的一个搜索功能,因为这个是我第一次了解运用elastic,所以如果有不对的地方,大家可以指出来,话不多说,先看看我的一个大致流程   这里我采用的sdk的版本是Elastic.Clients.Elasticsearch,Version=......
  • 网页无法复制粘贴?Force Copy插件帮你解决难题
    当我们浏览网页的时候,看到感兴趣的内容就特别想把它复制下来。但经常是有的网站复制要强制登录,有的复制需要付费,甚至有的网站都没有复制这一选项。这时,我们可以用到这个插件。如何使用操作方法,打开Chrome后,点击右上角的插件,再点击第一栏的开关,就可以在网页中复制。软件界......
  • 在 Elasticsearch 中段(Segment)的组成部分
    在Elasticsearch中,一个索引由多个**分片(Shard)**组成,而每个分片又由多个**段(Segment)**构成。段是索引的最小搜索单元,是不可变的,一旦创建,其内容就不会再改变。以下是段(Segment)的组成部分:1.**倒排索引(InvertedIndex)**:这是Elasticsearch用来实现快速搜索的核心数据结构。它......
  • Codeforces Round 974 (Div. 3)
    A:按题意模拟。B:\(i^i\)与\(i\)奇偶性相同,求\((n-k,n]\)的奇数个数。C:二分答案。D:即求每个\((i-d,i]\)有多少线段覆盖。扫到\(i\)时加入所有\(i=l\)的,弹出所有\(r\lei-d\)的。E:枚举相遇点,答案就是\(\min\big(\max(d_1,d_2)\big)\),最短路时记录状态......