划分型dp,CF 1935C - Messenger in MAC

news/2024/9/23 4:32:01/

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

1935C - Messenger in MAC


二、解题报告

1、思路分析

比较简单的思路是反悔贪心,这里不展开说了,来说一下dp的做法

由于式子里面带绝对值,很烦,我们将pair按照b升序排序,那么原式就变为

sum(a) + max(b) - min(b)

我们定义状态f(i, j) 为 前 i  个数 选了 j  个数 且以 (a[i], b[i]) 结尾,即第 i 个 数必选的最小 sum(a) - min(b) 的花费,这样定义是因为第 i 个数必选,那么max(b) 一定是 b[i]

则 f(i + 1, j + 1) = min(f(k, j)) + a[i]

枚举  k的话就变成了O(N^3),考虑维护前缀最小值,可以优化到O(N^2)

滚动数组优化又可以优化空间到O(N)

2、复杂度

时间复杂度: O(N^2)空间复杂度:O(N)

3、代码详解

 ​
#include <bits/stdc++.h>
#define sc scanf
using i64 = long long;
using i128 = __int128;
using PII = std::pair<int, int>;
constexpr int inf32 = 1e9 + 7;
constexpr i64 inf64 = 1e18 + 7;
constexpr int P = 998244353;
constexpr double eps = 1e-6;// #define DEBUGvoid solve()
{int n, L;std::cin >> n >> L;std::vector<int> a(n), b(n);for (int i = 0; i < n; ++ i) std::cin >> a[i] >> b[i];std::vector<int> p(n);std::iota(p.begin(), p.end(), 0);std::sort(p.begin(), p.end(), [&b](int i, int j) {return b[i] < b[j];});int res = 0;std::vector<i64> f(n + 1, inf64);for (int k = 0; k < n; ++ k) {int i = p[k];for (int j = k + 1; j; -- j) {f[j + 1] = std::min(f[j + 1], f[j] + a[i]);if (f[j] + b[i] + a[i] <= L)res = std::max(res, j + 1);}f[1] = std::min<i64>(f[1], a[i] - b[i]);if (a[i] <= L) res = std::max(res, 1);}std::cout << res << '\n';
}int main()
{
#ifdef DEBUGfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);int _ = 1;std::cin >> _;while (_--)solve();return 0;
}


http://www.ppmy.cn/news/1501326.html

相关文章

计算机毕业设计hadoop+spark+hive知识图谱股票推荐系统 股票数据分析可视化大屏 股票基金爬虫 股票基金大数据 机器学习 大数据毕业设计

目 录 摘 要 Abstract 第1章 前 言 1.1 项目的背景和意义 1.2 研究现状 1.3 项目的目标和范围 1.4 论文结构简介 第2章 技术与原理 2.1 开发原理 2.2 开发工具 2.3 关键技术 第3章 需求建模 3.1 系统可行性分析 3.2 功能需求分析 3.3 非功能性…

算法:动态规划,贪心算法和NP完全性

动态规划 动态规划算法与分治法类似&#xff0c;其基本思想也是将待求解问题分解成若干个子问题&#xff0c;但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时&#xff0c;有些子问题被重复计算了许多次。如果能够保存已解决的…

c++网络编程实战——开发基于ftp协议的文件传输模块(三) 封装自己的ftp客户端

一.前言 在前面我们已经简单介绍过FTP协议的基本概念以及我们如何配置FTP服务和一些常用的ftp命令,这篇文章主要是介绍我们如何基于开源库去封装我们自己的ftp客户端。这篇文章也可以看做一篇介绍如何基于开源库去封装自己工具库的教程。 补充: 在上一篇文章中我犯了一个小错…

Vue3通用页面(表格,页头,分页,编辑,删除)

<script lang"ts" setup name"Canset-JDfund"> import { AddJDsetAPI, EditJDsetAPI, DelJDsetAPI, GetWLFsetListtAPI } from /api/canset/tfset // #region *****************XXXX模块**************** // #endregion const params {pageNo: 1, /…

Symfony 入门指南:快速安装与基础配置

Symfony 入门指南&#xff1a;快速安装与基础配置 Symfony 是一个强大而灵活的 PHP 框架&#xff0c;广泛应用于构建现代 Web 应用程序。本指南将带您一步一步地了解如何快速安装 Symfony&#xff0c;并完成基本配置&#xff0c;以便您能够开始使用这个强大的框架。 目录 引…

【java基础】spring springMVC springboot 的区别

Spring, Spring MVC, 和 Spring Boot 是三个紧密相关的技术&#xff0c;它们都是由 Pivotal 团队&#xff08;原SpringSource&#xff09;开发的&#xff0c;主要用于构建企业级的Java应用程序。尽管它们在功能上有所交集&#xff0c;但各自也有独特的定位和用途。 Spring Fra…

vue + xterm 前端终端terminal

引入 import {Terminal} from "xterm"; import {FitAddon} from "xterm-addon-fit"; import "xterm/css/xterm.css";html <div id"terminal"></div>vue onMounted(() > {nextTick(() > {initTerm();}) })const i…

c++中的哈希查找(Hash Search)和B树查找(B-Tree Search)

前言 hello大家好啊&#xff0c;我是文宇&#xff0c;不是文字&#xff0c;是文宇哦&#xff0c;这期也是关于查找算法的。 哈希查找&#xff08;Hash Search&#xff09; 哈希查找&#xff08;Hash Search&#xff09;是一种基于哈希表的查找算法&#xff0c;它可以在常数时…