[补题记录] Atcoder Beginner Contest 322(E)

news2024/12/24 10:22:45

URL:https://atcoder.jp/contests/abc322

目录

E

Probelm/题意

Thought/思路

Code/代码


E

Probelm/题意

有 N 个改进计划,每个计划可以执行一次;有 K 个参数,每个计划可以将所有参数提升固定值,即计划 i 可以为第 j 个参数提升 Aij 的数值。每个计划有花费 Ci,问最少多少花费,能让所有参数都 >= P。

其中 1 <= K, P <= 5;1 <= N <= 100。

Thought/思路

假如只有一个参数,我们很容易想到这是一个 dp。比如:

dp[i][A1] = min(dp[i][A1], dp[i - 1][0 + A1])

dp[i][x] = min(dp[i][x], dp[i - 1][x - A1])


但是现在有 K 个参数,也就是说,我们无法确定 dp 数组的维度。

考虑 K = 5 的情况,就会有 dp[i][A1][A2][A3][A4][A5];再考虑一个参数时,我们是如何得到答案的,显然是通过维护 dp[i][0] ~ dp[i][P] 的最小值来的得到答案 dp[n][P]。

那么我们就可以这样做,将参数 [A1][A2][A3] 视作一系列 P + 1 进制的数(因为需要到达 P),如:[0][0][0] ~ [5][5][5] 就是一系列 3 位的 6 进制数。


这样,就可以将不确定的维度,转换为一维的:dp[i][0 ~ pow(P + 1, K) - 1]。

当我们在状态转移的时候,就可以将十进制的整数,转换为 K 进制数组,对应每个计划的 Aij,算出需要维护的 dp 下一个状态。

Code/代码

#include "bits/stdc++.h"

#define int long long

const int inf = 1e15;

int n, k, p, dp[107][8003];

std::vector <int> tenToK(int x, int k, int bit) { // k 进制
	std::vector <int> res(bit);
    for (int i = 0; i < bit; ++ i) {
        res[i] = x % k;
        x /= k;
    }
    std::reverse(res.begin(), res.end());
    return res;
}

int kToTen(std::vector <int> x, int k, int bit) {
	int res = 0;
    for (int i = 0; i < bit; ++ i) {
        res = res * k + x[i];
    }
    return res;
}

signed main() {
	std::cin >> n >> k >> p;

	int size = (int)std::pow(p + 1, k);

	for (int i = 0; i <= n; ++ i) {
		for (int j = 0; j < size; ++ j) {
			dp[i][j] = inf;
		}
	}
	dp[0][0] = 0;
	
	
	for (int i = 1; i <= n; ++ i) {
		int c; std::cin >> c;

		std::vector <int> a(k);
		for (int j = 0; j < k; ++ j) {
			std::cin >> a[j];
		}

		for (int j = 0; j < size; ++ j) dp[i][j] = dp[i - 1][j]; // 不选 i 的情况

		for (int j = 0; j < size; ++ j) {
			std::vector <int> now = tenToK(j, p + 1, k);

			for (int l = 0; l < k; ++ l) 
				now[l] = std::min(p, now[l] + a[l]);

			int next = kToTen(now, p + 1, k);

			dp[i][next] = std::min(dp[i][next], dp[i - 1][j] + c);
		}
	}

	std::cout << (dp[n][size - 1] == inf ? -1 : dp[n][size - 1]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1063081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C国演义] 第十三章

第十三章 三数之和四数之和 三数之和 力扣链接 根据题目要求: 返回的数对应的下标各不相同三个数之和等于0不可包含重复的三元组 – – 即顺序是不做要求的 如: [-1 0 1] 和 [0, 1, -1] 是同一个三元组输出答案顺序不做要求 暴力解法: 排序 3个for循环 去重 — — N^3, …

leetcode 343.整数拆分、96.不同的二叉搜索树

343.整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36…

游戏设计模式专栏(五):三步学会原型模式

引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》&#xff0c;让糟糕的代码在潜移默化中升华&#xff0c;欢迎大家关注分享收藏订阅。 原型模式在游戏开发中是一种重要的设计模式&#xff0c;…

做外贸独立站选Shopify还是WordPress?

现在确实会有很多新人想做独立站&#xff0c;毕竟跨境电商平台内卷严重&#xff0c;平台规则限制不断升级&#xff0c;脱离平台“绑架”布局独立站&#xff0c;才能获得更多流量、订单、塑造品牌价值。然而&#xff0c;在选择建立外贸独立站的过程中&#xff0c;选择适合的建站…

Spring Bean 作用域与生命周期

1 Spring Bean 作用域 Spring 3 中为 Bean 定义了 5 中作用域&#xff0c;分别为 singleton&#xff08;单例&#xff09;、prototype&#xff08;原型&#xff09;、 request、session 和 global session&#xff0c;5 种作用域说明如下&#xff1a;singleton &#xff1a;单例…

布局与打包

属性栏直接输入值&#xff0c;比代码更直观方便。 打包&#xff1a;

五、运算表达式

5、运算表达式 1.3、运算表达式 运算表达式只能用于属性上&#xff0c;而不能在[[]]中使用 1.3.1、算术运算 thymeleaf可以使用以下算术运算符&#xff1a; , - , * , / , %&#xff1b; 示例 TestServlet中添加两个整数值 request.setAttribute("num1", 6); …

前端搭建名言生成器(内附源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ JS是什么&#xff1f;✨ 名言生成器✨ 页面搭建✨ 功能实现 ✨ 写在前面 在上周我们通过HTML、CSS实现了一个简单的‘我的相册‘页面的搭建&#xff0c;很多伙伴呢跟我说难道前端就只能做一些页面搭建的工作吗&#xff1…

带头双向循环链表

目录 1 链表的种类1.1 第一对1.2 第二对1.3 第三对1.4 常用 2 带头双向循环链表的实现2.1 创建2.2 初始化2.3 打印2.4 尾插2.5 尾删2.6 头插2.7 头删2.7.1 两个变量2.7.2 三个变量 2.8 查找x所在位置2.9 在pos节点前插入x2.10 删除pos节点2.11 销毁链表 1 链表的种类 1.1 第一…

AS环境,版本问题,android开发布局知识

项目模式下有一个build.gradle,每个模块也有自己的build.gradle Android模式下有多个build.gradle&#xff0c;汇总在一起。&#xff08;都会有标注是哪个模块下的&#xff09; C:\Users\Administrator\AndroidStudioProjects 项目默认位置 Java web项目与android项目的区别…

队列(循环数组队列,用队列实现栈,用栈实现队列)

基础知识 队列(Queue):先进先出的数据结果,底层由双向链表实现 入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为对头 常用方法 boolean offer(E e) 入队 E(弹出元素的类型) poll() 出队 peek() 获取队头 int size 获取队列元素个数 boolean isEmpty(…

Spring Boot项目中热点场景详解(万字总结)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★

循环读取图像实例

list image files (::mageDirectory,Extensions,Options:ImageFiles) par_join算子用于在调用程序中等待所有在单独的子线程中启动的程序或算子&#xff0c;方法是将par_start&#xff08;启动的线程&#xff09;添加到相应的程序行中&#xff08; by adding the par_start qu…

CleanMyMac X4.14.1最新版本下载

CleanMyMac X是一个功能强大的Mac清理软件&#xff0c;它的设计理念是提供多个模块&#xff0c;包括垃圾清理、安全保护、速度优化、应用程序管理和文档管理粉碎等&#xff0c;以满足用户的不同需求。软件的界面简洁直观&#xff0c;让用户能够轻松进行日常的清理操作。 使用C…

(32)测距仪(声纳、激光雷达、深度摄影机)

文章目录 前言 32.1 单向测距仪 32.2 全向性近距离测距仪 32.3 基于视觉的传感器 前言 旋翼飞机/固定翼/无人车支持多种不同的测距仪&#xff0c;包括激光雷达&#xff08;使用激光或红外线光束进行距离测量&#xff09;、360 度激光雷达&#xff08;可探测多个方向的障碍…

GEE土地分类——Property ‘B1‘ of feature ‘LE07_066018_20220603‘ is missing.错误

简介&#xff1a; 我正在尝试使用我在研究区域中选择的训练点对图像集合中的每个图像进行分类。就背景而言&#xff0c;我正在进行的项目正在研究陆地卫星生命周期内冰川面积的变化以及随后的植被变化。这意味着自 1984 年以来&#xff0c;我正在处理大量图像&#xff0c;每年一…

C语言qsort函数

排序qsort int int cmp(const void *a, const void *b) {return *(int *)a - *(int *)b;//先强转成int型&#xff0c;后解引用取值比较大小 }字符串数组 char a[] “hello world” //字符串数组&#xff0c;存放的是字符 int cmp(const void *a, const void *b) {return *(…

【linux进程(二)】如何创建子进程?--fork函数深度剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程状态管理 1. 前言2. 查看…

Nacos单机配置集群配置

大家好我是苏麟今天带来Nacos单机配置和集群配置 Nacos报错 理论上启动nacos&#xff0c;只需要双击startup.cmd文件&#xff08;win下&#xff09;&#xff0c;就可以直接启动&#xff0c;但是从GitHub上下载当前最新版Nocas(下载地址)&#xff0c;下载后进入bin目录双击sta…

生成Release版本的.pdb文件

软件分为Debug版本、Release版本这2种版本&#xff0c;其中Debug版本是带有.pdb调试信息文件&#xff0c;而Release版本不带.pdb调试信息文件。软件发布时&#xff0c;一般采用Release版本&#xff0c;若因内存泄漏、数组访问越界、除零错误、磁盘读写错误等异常&#xff0c;造…