[蓝桥杯 2020 省 A1] 超级胶水

一.题目

题目描述

小明有 n 颗石子,按顺序摆成一排。

他准备用胶水将这些石子粘在一起。

每颗石子有自己的重量,如果将两颗石子粘在一起,将合并成一颗新的石子,重量是这两颗石子的重量之和。

为了保证石子粘贴牢固,粘贴两颗石子所需要的胶水与两颗石子的重量乘积成正比,本题不考虑物理单位,认为所需要的胶水在数值上等于两颗石子重量的乘积。

每次合并,小明只能合并位置相邻的两颗石子,并将合并出的新石子放在原来的位置。

现在,小明想用最少的胶水将所有石子粘在一起,请帮助小明计算最少需要多少胶水。

输入格式

输入的第一行包含一个整数 n,表示初始时的石子数量。

第二行包含 n 个整数 w 1 , w 2 , … , w n w_1,w_2,…,w_n w1,w2,,wn,依次表示每颗石子的重量。

输出格式

输出一个整数代表答案。

数据范围

1 ≤ N ≤ 1000,
1 ≤ w i w_i wi ≤ 1000

输入样例1

3
3 4 5

输出样例1

47

输入样例2

8
1 5 2 6 3 7 4 8

输出样例2

546

二.解释

看完题目,一眼贪心,想到之前做过的类似题目(合并石头、合并果子等),先找出相邻乘积最小的两项,按要求计算,但是这样只能过 80% 的数据。

直接计算最复杂的是在序列中找最小乘积的两项,

n = 3,有序列 = {a,b, c}
我们按要求先合并相邻:
合并a,b,则有f1 = (a * b)+ (a + b) * c = (a * b) + (b * c) + (a * c);
合并b,c,则有f2 = (b * c)+ (b + c) * a = (a * b) + (b * c) + (a * c);
合并不相邻:
合并a,c,则有f3 = (a * c)+ (a + c) * b = (a * b) + (b * c) + (a * c);
f1 = f2 = f3

n = k,有序列 = { a 1 , a 2 , … … , a k a_1, a_2, ……, a_k a1,a2,……,ak}:
我们按要求先合并相邻:
一直合并头两项,则有f1 = ( a 1 ∗ a 2 a_1 * a_2 a1a2) + ( a 1 + a 2 a_1 + a_2 a1+a2) * a 3 a_3 a3 + ( a 1 + a 2 + a 3 a_1 + a_2 + a_3 a1+a2+a3) * a 4 a_4 a4 + …… + ( a 1 + a 2 + … … + a k − 1 a_1 + a_2 + …… + a_{k - 1} a1+a2+……+ak1) * a k a_k ak = ( a 1 ∗ a 2 a_1 * a_2 a1a2) + ( a 1 ∗ a 3 a_1 * a_3 a1a3) + …… + ( a 1 ∗ a k a_1 * a_k a1ak) + ( a 2 ∗ a 3 a_2 * a_3 a2a3) + …… + ( a k − 1 ∗ a k a_{k - 1} * a_k ak1ak);
合并其他相邻两项结果也是一样的,可以自己列举。
和并不相邻的两项时,则有f2 = ( a 1 ∗ a j a_1 * a_j a1aj) + ( a 1 + a i a_1 + a_i a1+ai) * a j a_j aj + ( a 1 + a i + a j a_1 + a_i + a_j a1+ai+aj) * a x a_x ax + …… + ( a 1 + a i + a j + … … + a y a_1 + a_i + a_j + …… + a_y a1+ai+aj+……+ay) * a z a_z az = ( a 1 ∗ a 2 a_1 * a_2 a1a2) + ( a 1 ∗ a 3 a_1 * a_3 a1a3) + …… + ( a 1 ∗ a k a_1 * a_k a1ak) + ( a 2 ∗ a 3 a_2 * a_3 a2a3) + …… + ( a k − 1 ∗ a k a_{k - 1} * a_k ak1ak);
f1 = f2;

因此合并顺序不会有影响结果,我们可以用一个小顶堆来取数据,每次pop顶端两个数,合并之后再加回堆中即可。

第二种方法,从上面的推导结果我们发现,最终结果都是序列中任意两个数相乘再相加,因此我们可以直接算,再 O(N) 的复杂度得出结果。

三.代码

暴力计算:
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>using namespace std;typedef long long int64;
const int MaxN = 1e5 + 10;int64 InN, InK, Res;
vector<int64> Ns;int main()
{cin >> InN;int a;for (int i = 1; i <= InN; i++){scanf("%d", &a);Ns.push_back(a);}while (Ns.size() > 1){int64 x = 0, y = 1, z = Ns[x] * Ns[y];//取出最小乘积的相邻两个数for (int i = 1; i < Ns.size() - 1; i++){if (z > Ns[i] * Ns[i + 1]){z = Ns[i] * Ns[i + 1];x = i, y = i + 1;}}//放到原位置Res += z;Ns[x] = Ns[x] + Ns[y];Ns.erase(Ns.begin() + y);}cout << Res;return 0;
}
堆优化:
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <set>using namespace std;typedef long long int64;
const int MaxN = 1e5 + 10;int64 InN, InK, Res;
int64 Ns[MaxN];
priority_queue<int64, vector<int64>, greater<int64>> PQ;int main()
{cin >> InN;int64 a;for (int i = 1; i <= InN; i++){scanf("%lld", &a);PQ.push(a);}//优化部分while (PQ.size() > 1){int64 A = PQ.top();PQ.pop();int64 B = PQ.top();PQ.pop();PQ.push(A + B);Res += A * B;}cout << Res;return 0;
}
第二种解法:
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>using namespace std;typedef long long int64;
const int MaxN = 1e5 + 10;int64 InN, InK, Res;
int64 Ns[MaxN];int main()
{cin >> InN;int64 a;for (int i = 1; i <= InN; i++){scanf("%lld", Ns + i);}int64 S = Ns[1];for (int i = 2; i <= InN; i++){Res += Ns[i] * S;	//累加S += Ns[i];			//前i项的和}cout << Res;return 0;
}

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

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

相关文章

AutoMQ 社区双周精选第十期

本期概要 欢迎来到 AutoMQ 第十期双周精选&#xff01;在过去两周里&#xff0c;主干动态方面&#xff0c;AutoMQ 发布了 1.0.5 版本&#xff0c;该版本将默认日志滚动方式从小时滚动切换到大小滚动&#xff0c;且优化了大规模对象删除的性能。另外&#xff0c;AutoBalancing …

入门五(项目介绍及登录需求)

软件缺陷判定标准 项目中缺陷的管理流程 使用Excel对于缺陷进行管理 使用工具管理缺陷 一、项目背景 传智作为一个IT教育机构&#xff0c;拥有自己开发且实际运营的产品&#xff1b; 将开发和运营的技术作为授课的内容&#xff0c;对于学员而言学到的都是一手的真实案例和…

.net 框架基础(二) 日期和时间

总目录 C# 语法总目录 .net 框架基础 二 日期和时间 日期和时间1. TimeSpan2. DateTime 日期和时间 System空间下有三个不可变的结构体进行事件表示:DateTime、DateTimeOffset、TimeSpan 1. TimeSpan 创建TimeSpan方法&#xff1a; 通过构造器通过调用其中一个静态 From ……

VPP FIB路径链表环路检查

对于路径链表中的三种路径类型&#xff1a; FIB_PATH_TYPE_RECURSIVE FIB_PATH_TYPE_ATTACHED_NEXT_HOP FIB_PATH_TYPE_ATTACHED在添加新的路径时需要进行路径环路检查。函数fib_path_list_recursive_loop_detect会被反复调用。 static void fib_entry_recursive_loop_detect…

MySQL-数据库设计规范

1、范式 1.1、概述 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式常见六种范式&#xff0c;按照范式级别由低到高如下所示&#xff1a; 第一范式第二范式第三范式巴斯范式第四范式第五范式 1.2、键和相关属性 范式的定义会用法主键和候选键&…

llllllllll

llllllllllllllll

gulp 构建Node.js 应用

安装 ## 安装 gulp 命令行工具 npm install --global gulp-cli## 安装 gulp&#xff0c;作为开发时依赖项 npm install --save-dev gulp为什么要用Gulp ? 在前端开发中&#xff0c;Gulp是一个node.js 的自动化构建工具&#xff0c;它通过流和代码优于配置的策略来简化任务编…

类的继承和方法重载

想象一下&#xff0c;有一个相亲想爱的一家人家族树。在这个家族树中&#xff0c;有一个祖先&#xff08;父类&#xff09;&#xff0c;它拥有一些基本的特征和行为&#xff0c;比如家族的传统、姓氏、某些共同的技能或知识。 现在&#xff0c;这个祖先有多个后代&#xff08;…

vivado 设计连接性

设计连接性 IP集成商提供设计师协助&#xff0c;帮助您完成连接过程 设计。图3显示了MHS的一个示例&#xff0c;图4显示了设计帮助 可在IP集成商中获得 地址映射 在XPS中&#xff0c;无论主机访问从机IP&#xff0c;每个从机都有相同的地址。IP integrator为基于master的寻址提…

【C++课程学习】:命名空间的理解(图文详解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f4f7;1.命名冲突 &#x1f4f7;2.重定义 &#x1f4f7;3.命名空间 &#x1f37a;命名空间可…

Leetcode刷题笔记3

18. 四数之和 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&…

解决Element组件el-switch在Vue中值的绑定与回显问题

概要 Switch 开关表示两种相互对立的状态间的切换,多用于触发「开/关」。可当一个布尔值进行使用。 问题描述与解决 引入Element组件的switch到Vue中,可以读取switch的值,但如果放在页面中,不能回显上去。 如上图,无论值是"否"还是“是”。都不能正确渲染到页…

Make New 函数 ---golang

make 和 new 函数的使用区别 共同点&#xff1a; make 函数和new 函数都是用来申请内存地址的。不同点 1、new函数的使用相对来比较少&#xff0c;用于对一般的数据类型&#xff0c;做数据类型申请 如&#xff1a; string&#xff0c; int&#xff0c;且申请的为 指针类型。…

vue-officef实现pdf文件在线预览

一、参考网址 https://www.cnblogs.com/guozhiqiang/p/17957288 1、引入依赖 npm install vue-office/pdf vue-demi2、编写组件 <template><vue-office-pdf :src"pdf"/> </template> <script> // import pdf from vue-pdf import VueOffice…

基于长短期记忆网络 LSTM 的送餐时间预测

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

Linux Kernel入门到精通系列讲解(RV-U-boot 篇) 4.2 RISC-V从零移植自己的Uboot

1. 概述 上一章节我们已经成功从OpenSBI跳转到Uboot,并且已经把默认的qemu-riscv64_smode_defconfig移植成功了,本章节我们将会重新规划memory 分区,方便后续创建更多的设备,并且从零开始移植一个属于Naruto Pi的uboot。 2. 重建分区表 2.1 当前QEMU已创建Memory 地址大小…

实战13:lstm bp 机器学习随机森林粮食产量预测-完整代码数据

直接看视频: lstm bp 机器学习随机森林粮食产量预测-完整代码数据_哔哩哔哩_bilibili 看数据: 代码: from sklearn.linear_model import LinearRegression from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from…

postgresql|数据库|闪回插件e-maj的部署和使用

前言&#xff1a; E-Maj 是 PostgreSQL 数据库的一个扩展插件&#xff0c;它的全称为 "Elementary Majordomo"。这个扩展的主要功能是为数据库中的表集提供细粒度的写入日志记录和时间旅行能力。这意味着使用 E-Maj 的用户可以在数据库的特定子集上实现事务的回滚&a…

C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记

C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记 ——2024-05-26 夜 code review! 参考博文 C++笔记之获取当前本地时间以及utc时间

Linux定时计划

定时计划 一、计划任务种类 突发性&#xff1a;临时决定只执行一次的任务 at&#xff1a;处理执行一次任务就结束定时性&#xff1a;每隔一定时间需要重复执行此命令 crontab&#xff1a;指定任务&#xff0c;按照设定的周期一直循环执行二、作用 定时任务可以用于自动备份…