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

洛谷 P1687 机器人小Q(DP)

题目链接

https://www.luogu.com.cn/problem/P1687

思路

因为要按照顺序来给机器人充电,所以考虑 d p dp dp

d p [ i ] [ j ] = { x , y } dp[i][j] = \{x,y\} dp[i][j]={x,y}表示从前 i i i个单位能量中选了 j j j个对机器人进行充电,所用的最小天数为 x x x,天数 x x x最小时最后一天的充电时长最短为 y y y

状态转移方程为: d p [ i ] [ j ] = a d j ( d p [ i − 1 ] [ j ] , a d j ( d p [ i − 1 ] [ j − 1 ] , v [ i − 1 ] ) ) dp[i][j] = adj(dp[i - 1][j], adj(dp[i - 1][j - 1], v[i - 1])) dp[i][j]=adj(dp[i1][j],adj(dp[i1][j1],v[i1]))。其中, a d j ( ) adj() adj()函数起到取最小值的作用。

时间复杂度: O ( n k ) O(nk) O(nk)

代码

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define double long double

typedef long long i64;
typedef unsigned long long u64;
typedef pair<int, int> pii;

const int N = 3e3 + 5, M = 5e5 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f3f3f3f3f;

std::mt19937 rnd(time(0));

int n, k;
int a[N];
pii dp[2][N];
pii adj(pii a, pii b)
{
	if (a.first > b.first)
		return b;
	if (a.first < b.first)
		return a;
	if (a.second > b.second)
		a = b;
	return a;
}
pii adj(pii a, int b)
{
	if (a.second + b <= 119)
		a.second += b;
	else
	{
		a.first++;
		a.second = b;
	}
	return a;
}
int adj(int a, pii b)
{
	int res = b.first;
	if (b.second) res++;
	return max(a, res);
}
void solve()
{
	cin >> n >> k;
	vector<int>v;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		if (a[i] < 120) v.push_back(a[i]);
	}
	if (v.size() < k)
	{
		cout << "You can't do it." << endl;
		return;
	}
	int m = v.size();
	for (int i = 0; i <= m; i++)
	{
		for (int j = 0; j <= k; j++)
		{
			dp[i & 1][j] = {inf, inf};
		}
	}
	dp[0][0] = {0, 0};
	for (int i = 1; i <= m; i++)
	{
		int idx = i & 1;
		for (int j = 1; j <= k; j++)
		{
			if (j > i) break;
			dp[idx][j] = adj(dp[idx ^ 1][j], adj(dp[idx ^ 1][j - 1], v[i - 1]));
		}
	}
	int ans = 0;
	ans = adj(ans, dp[m & 1][k]);
	cout << ans << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int test = 1;
	// cin >> test;
	for (int i = 1; i <= test; i++)
	{
		solve();
	}
	return 0;
}

http://www.kler.cn/a/518808.html

相关文章:

  • JVM深入学习(一)
  • Vue.js组件开发-如何实现带有搜索功能的下拉框
  • PHP防伪溯源一体化管理系统小程序
  • 数据融合的经典模型:早期融合、中期融合与后期融合的对比
  • Python “字典” 实战案例:5个项目开发实例
  • mysql 学习6 DML语句,对数据库中的表进行 增 删 改 操作
  • AI视频生成技术:Sora的突破与挑战
  • 第五部分:Linux中的gcc/g++以及gdb和makefile
  • React第二十五章(受控组件/非受控组件)
  • AI对齐服务:从7.5亿美元市场到创新转型
  • 罗氏线圈的学习【一】
  • 多线程详解——Kotlin多线程几种实现方式
  • 2024年CSDN年度回顾:个人成长、创作历程与生活的融合与平衡
  • 在Ubuntu上使用Apache+MariaDB安装部署Nextcloud并修改默认存储路径
  • 编码器和扩散模型
  • centos搭建docker registry镜像仓库
  • Alibaba Spring Cloud 十六 Sentinel 流量控制
  • Qt Designer and Python: Build Your GUI
  • fpga系列 硬件:FPGA 最小系统参考图与图释+Zynq-7010 最小系统Zynq-7010 启动配置
  • 解锁 MySQL 数据库的无限潜能:全方位深度解析
  • 容器内判断当前的运行环境是docker还是podman
  • 从曾国藩的经历看如何打破成长中的瓶颈
  • 【算法】数论基础——唯一分解定理(算术基本定理)python
  • ES6 类语法:JavaScript 的现代化面向对象编程
  • 前端开发学习路线
  • 【信息系统项目管理师-选择真题】2017下半年综合知识答案和详解