备战2023蓝桥国赛-饼干

news2025/1/16 18:44:03

题目描述:
在这里插入图片描述
在这里插入图片描述
解析:
这道题我想了很多种解决方法,但无一例外都失败了,实在是按照常规线性DP的思路真的想不出来。
看了题解之后才知道它是分为三步解决这个问题的:
第一步:缩小最优解的范围
先用贪心将最优解缩小到某个较小的范围内,再DP求出精确的最优解。
这里就要用到排序不等式了。什么是排序不等式?假设有两个数组,数组a和数组b,满足数组a中的数从小到大递增,数组b中的数从大到小递减,那么a,b两个数组分别相乘之和的最大值一定是a[1]✖b[n]+a[2]✖b[n-1]+…a[n]✖b[1],最小值一定是a[1]✖b[1]+a[2]✖b[2]+…a[n]✖b[n]。
证明也很简单,就不多说了。
根据排序不等式,我们知道g[i]的值越大,与他相乘的数就要越小,g[i]对应的饼干数也就越大,故本问题的最优解一定在如下的子集中:将所有小朋友按愤怒值g[i]从大到小排序,排名靠前的小朋友分配的饼干要更多一些。
第二步:用DP寻找最优解
此题的状态划分方式与AcWing 900. 整数划分类似,前者是以最小数是不是1来划分,后者是以最后有几个1来划分的。分析图如下所示:
在这里插入图片描述
这个划分方法挺难想的,你没做过类似题真难想出来。
现在说说为什么这道题的划分方法与整数划分这道题不一样:写过整数划分这道题的人都知道,这道题有至少两种解决方法,第一种用完全背包问题的思想写,第二种就是以最小数是不是1来划分来写。这第二种方法是定义f[i,j]:总和为i,选的整数个数为j的做法总数,当最小数是1时为f[i-1][j-1],当最小数不是1时为f[i-j][j],也就是整体都减1,那么加起来就是f[i][j]了。要注意的是整数划分这道题是求方案数,而我们这道题是求最小值!假如你用整数划分的方法来求会出现什么结果呢?你会发现当最小值是1的情况下,你无法求出最小值,因为你不知道有多少个数大于1,而用最后有几个人分配1个饼干就能完美解决这个问题,就是f[i - k][j - k] + (sum[i] - sum[i - k]) * (i - k),sum[i]是g[i]排序后的前缀和,而当1的个数为0时,我们就跟整数划分一样,整体都减1,就是f[i][j-i],然后从中取min就可以了。
初值就先让f全为0x3f3f3f3f,之后让f[0][0]等于0就行了,也就是只能从这个点开始转移。
第三步:倒推求路径
这道题不是求出最值就解决了,你还要将各个小朋友的饼干数的取值也要表示出来,也就是要求路径。
求路径有两种方法,一种是在求的过程中记下路径,这种方法在bfs过程中很常用,另一种就是倒推了,找出每个状态是由哪个状态计算得到的即可。
倒推过程中要注意偏移量h,因为我们在求的过程中可能会有让整体都减1的操作,而且可能会有好几次,那么就要我们在倒推过程中就要加上这个偏移量,不然会出错。

代码:

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f,N=35,M=5010;
typedef pair<int,int> PII;
PII g[N];
int dp[N][M];
int sum[N],ans[N];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>g[i].first;
		g[i].second=i;
	}
	sort(g+1,g+1+n);
	reverse(g+1,g+1+n);
	
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]+g[i].first;
	
	memset(dp,0x3f,sizeof dp);
	dp[0][0]=0;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=m;j++)
		{
			dp[i][j]=dp[i][j-i];
			for(int k=1;k<=i;k++)
			{
				dp[i][j]=min(dp[i][j],dp[i-k][j-k]+(sum[i]-sum[i-k])*(i-k));
			}
		}
	}
	cout<<dp[n][m]<<endl;
	
	int i=n,j=m,h=0;
	while(i&&j)
	{
		if(j>=i&&dp[i][j]==dp[i][j-i]) j-=i,h++;
		else{
			for(int k=1;k<=i&&k<=j;k++)
			{
				if(dp[i][j]==dp[i-k][j-k]+(sum[i]-sum[i-k])*(i-k))
				{
					for(int u=i;u>i-k;u--)
					ans[g[u].second]=1+h;
					
					i-=k,j-=k;
					break;
				}
				
			}
		}
	}
	for(int i=1;i<=n;i++)
	cout<<ans[i]<<" ";
	return 0;
}

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

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

相关文章

如何准备好2023年的USACO?

目录 1. 注册 2. 刷题 3. 备考 4. 考试流程/介绍 5. 铜组例题 1. 注册 先进入usaco的官网&#xff0c;主页的右边会有注册的选项&#xff0c;点击Register for New Account。会让你填你自己的用户名&#xff0c;邮箱&#xff0c;实名&#xff0c;毕业的年份&#xff0c;还…

世界杯数据分析

国际足联世界杯&#xff08;FIFA World Cup&#xff09; 文章目录前言一、历届世界杯数据分析&#xff08;一&#xff09;建表&#xff08;二&#xff09;导入数据&#xff08;三&#xff09;数据分析1. 全勤巴西2. 夺冠排名3. 扩军历史4. 进球之最二、本届世界杯数据分析&…

【Java寒假打卡】Java基础-数据类型以及转换

【Java寒假打卡】Java基础-数据类型以及转换一、关键字二、强制转换三、常量四、隐式转换的问题五、变量六、程序输入七、标识符八、类型转换一、关键字 含义&#xff1a;java 中被赋予特定含义和特点的单词 二、强制转换 数据范围大变量赋给一个数据范围小的变量int 到byte…

android绘制弧形背景

先看一下效果&#xff1a; 在drawable中写shape.xml文件 <?xml version"1.0" encoding"utf-8"?> <layer-list xmlns:android"http://schemas.android.com/apk/res/android"><item><shape><solid android:color&quo…

Hadoop学习----Hadoop介绍

Hadoop介绍 Hadoop是Apache软件基金会的一款开源软件。底层是由java语言实现。 功能&#xff1a;允许用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理。 Hadoop核心组件&#xff1a; Hadoop HDFS&#xff08;分布式文件存储系统&#xff09;&#xff1a;解…

大道至简——工具类产品的几个思考方向

因为之前没有接触过摹客的产品&#xff0c;对于一个经常使用Axure的产品经理&#xff0c;仅仅通过两周摹客的使用体验写出的体验文档确实不够严谨&#xff0c;所以以下除了表层的几点用户体验&#xff0c;重点还是谈一下对工具类产品发展方向的思考。 体验篇 一款产品的诞生肯…

4.2 YOLOv3算法

文章目录一、林业病虫害数据集和数据预处理方法介绍1.1 读取AI识虫数据集标注信息1.2 数据读取和预处理1.2.1 数据读取1.2.2 数据预处理**随机改变亮暗、对比度和颜色等****随机填充****随机裁剪****随机缩放****随机翻转****随机打乱真实框排列顺序****图像增广方法汇总**1.2.…

Oracle云服务器安全配置

在Oracle云上申请了一个免费云空间&#xff0c;据说是永久免费&#xff0c;这里记录一下安全配置问题。 一、访问Oracle云服务器 1、云服务器申请 如何在oracle注册申请云服务可自行搜索一下&#xff0c;有很多文章介绍。 甲骨文Oracle云服务器详细申请教程步骤及注意事项 …

如何计算香港服务器公网带宽的实际下载速度?

如何计算香港服务器公网带宽的实际下载速度?下面分享香港服务器带宽实际下载速度对照表及计算方法&#xff1a; 香港服务器带宽实际下载速度计算方法 香港服务器以1Mbps公网带宽为例&#xff0c;香港服务器1M带宽实际下载速度峰值128KB/S&#xff0c;为什么不是1M/S&#xff0…

电脑重装系统后重启电脑黑屏是怎么回事

​电脑重装系统后重启电脑黑屏怎么回事&#xff1f;最近有用户反映自己在重装电脑系统后&#xff0c;开机出现了黑屏的现象&#xff0c;检查后发现硬件设备没有故障&#xff0c;那么是怎么回事呢&#xff1f;有可能是显示器不支持该显卡显示的分辨率或者是重装系统后的显卡驱动…

结构建模设计——Solidworks软件之使用钣金折弯功能做一个带折弯固定口的铝合金面板

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

31岁才转行程序员,目前34了,我的经历和一些感受

按惯例&#xff0c;先说下我基本情况。我是85年的&#xff0c;计算机专业普通本科毕业。在一个二线城市&#xff0c;毕业后因为自身能力问题、认知水平问题&#xff0c;再加上运气不好&#xff0c;换过多份工作&#xff0c;每份工作都干不长。导致我30多岁时&#xff0c;还一事…

背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码

一、背包问题 1.1背包问题描述 背包问题(Knapsack Problem&#xff0c;KP)是一种重要的组合优化问题&#xff0c;在生活的许多领域都有着十分广泛的应用。背包问题可以描述为&#xff1a;给定一个背包和n种物品&#xff0c;其中&#xff0c;背包的容量为VVV &#xff0c;第i …

C++11标准模板(STL)- 算法(std::min_element)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 返回范围内的最小元素 st…

[附源码]Python计算机毕业设计个人资金账户管理Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

PMP考试有用吗?

有用&#xff0c;对于项目管理岗位来说&#xff0c;PMP 就是一个最基础的必备的证书&#xff0c;你说含金量有多高不见得&#xff0c;但是没有这个证书找工作可能会受阻。 下面这两种情况对 PMP 的需求是硬性要求&#xff0c;很现实&#xff0c;有证才能获得资格&#xff0c;没…

图算法在风控场景的应用

​导读&#xff1a;本文将分享图算法在风控中的应用。 今天的介绍会围绕下面四点展开&#xff1a; 图算法和风控简介 图算法在风控的演化 相应平台的心得 展望未来 分享嘉宾&#xff5c;汪浩然 互联网行业资深风控和图计算专家 编辑整理&#xff5c;戴杰 永辉超市 出品社…

Mybatis学习笔记

1.Mybatis是什么 MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集&#xff0c; 它可以使用简单的XML或注解来配置和映射SQL信息&#xff0c;将接口和 Java 的 POJOs(Plain …

Docker入门(基础篇)

Docker入门Docker相关概念为什么需要DockerDocker的理念容器与虚拟机的比较Docker的安装与使用安装Dockerdocker 的三要素Docker常用命令Docker相关概念 为什么需要Docker 为什么会出现Docker了&#xff1f;现在我们假设你在开发一个项目&#xff0c;你使用的是一台笔记本电脑…

前端显示分页详解(一)

我们在浏览页面的时候&#xff0c;是不是经常看到网页经常是以页面的形式给我们展现出来的&#xff0c;我们以淘宝的页面为例&#xff08;如下图&#xff09;&#xff0c;那这样按照页面呈现有什么好处呢&#xff1f;这篇文章让我们来深入探究了解这其中的奥秘。 优点&#xff…