信息学奥赛一本通/openjudge Crossing River

题目

一本通题目入口
openjudge题目入口
(注:由于一本通题面描述的可能有些欠缺,所以这里的题面采用openjudge英文翻译后的题面)
在这里插入图片描述

题目分析

首先我们来看样例,为什么样例的结果是17呢?首先观察,“5”和“10”较大,作为我们的首选要搞定的目标,那么我们怎样才能将“5”+“10”压小的点呢?我们可以以绝对贪心的角度去想。我若想让“5”+“10”的结果较小,肯定是要让其在一条船上,一起过河,此时我们就只用加“10”的时间了,那么这一下总得让船回来吧,难道要上“5”回来吗?不,肯定不能,所以我们得在河对岸安排一个数较小的人,让他将船再开回来,而送他过去自然又要一个数较小的,而最小的俩是“1”和“2”了,那么谁在对岸谁又送其过去呢?
假设“1”在对岸,则来回花费 m a x ( 1 , 2 ) + 1 + 2 max(1, 2)+1+2 max(1,2)+1+2
假设“2”在对岸,则来回花费 m a x ( 1 , 2 ) + 2 + 1 max(1,2)+2+1 max(1,2)+2+1
这俩结果一样,所以俩方案都行,那么由于搞定的最大的俩,剩下的俩可以一起过去,则这下时间为 m a x ( 1 , 2 ) + ( 1 + 2 ) 或 ( 2 + 1 ) + 10 + 2 = 17 max(1,2)+(1+2)或(2+1)+10+2=17 max(1,2)+1+2)(2+1)+10+2=17,刚好17。

经过上述的样例分析,我们得出一个比较省时间的方案(姑且先定为方案1):先让a和b(均为还没过河数中的较大值),一起过河,再通过媒介x(次小值或最小值),让船回来。
可是若次小的数c逼近于我选择的a和b(均为还没过河数中的较大值)时,会出现本来a和b一起乘船不大,但由于加入c这个逼近于a和b,而在算总时间时c要帮助最小值d(媒介x不是c自然是最小值d)过河,此时会算两次c(一次在max时,一次在返回时),在这种情况下总和自然会比其他方案要大的。
那么我若知道此时c会比较大,我肯定选择避开他,可比c还大的不能选,比c小的就一个最小值,故我们只能用最小值d使a和b过河,那么这种方案要最少时间,自然是贪心的让d一个一个的送a和b过河。
所以,为了应对a,b,c逼近m(m>=c 且 a,b>= m)的情况,我们设计如下方案(定为方案2):让最小值d送a和b过河。
最后由于方案1和方案2都是需要题面中n大于等于4的,所以对于n小于4的话可以直接特判断。
还有一个注意,最后未过河的数量可能不是0,所以需要和前面n小于4的情况一样的特判。

正解

此题使用贪心算法。
由于数据非有序,故要先排序,随后从高位进行枚举(未过河的数量小于4时终止),每次都需要比较此时用方案1还是方案2所需的时间小,并存在总时间变量sum里。最后特判n小于4或未过河的数量不是0的情况。
最后的代码:

#include<bits/stdc++.h>
using namespace std;inline int read()
{int X=0; bool flag=1; char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}if(flag) return X;return ~(X-1);
}
inline void write(int X)
{if(X<0) {X=~(X-1); putchar('-');}if(X>9) write(X/10);putchar(X%10+'0');
} 
const int N = 1050;
int n;
int a[N];
int main(){int T = read();while(T--){n = read();for (int i = 1; i <= n; ++i) a[i] = read();int sum = 0;sort(a + 1, a + n + 1);for (; n >= 4; n -= 2)  //每次送过河两人故每次减2{//求方案1和方案2的最小值加入总答案sum = sum + min(2 * a[1] + a[n] + a[n - 1], a[2] * 2 + a[1] + a[n]);}  //特判if (n == 3) {//任意俩先过去,这两种小的回来接另一个//比如说“1”和“3”先去,“1”回去接“2”,这样就是“1”+“2”+“3”sum = sum + a[1] + a[2] + a[3]; }else if(n == 2){sum = sum + a[2]; }else if (n == 1) sum += a[1];write(sum);puts("");}return 0;
}

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

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

相关文章

GUI编程04:课堂练习及总结

本节内容视频链接&#xff1a;6、课堂练习讲解及总结_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p6&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 根据前三节学习到的Frame、Panel、Button知识&#xff0c;画出一下窗口界面&#xff1a; 实现代码如下…

Spring Security基于token的极简示例

1 引言 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架&#xff0c;但是用起来有点复杂&#xff0c;为了便于学习理解&#xff0c;下面将用最简洁的配置和示例&#xff0c;展示整个流程。 2 代码 创建一个spring-security…

单图生成 2D 和 3D 人物,高质量图像处理模型 CharacterGen来啦!

CharacterGen引入了一个简化的生成流程和一个图像条件的多视图扩散模型。该模型有效地将输入姿态校准到规范形式&#xff0c;同时保留输入图像的关键属性&#xff0c;从而解决了多样化姿态带来的挑战。 CharacterGen的另一个核心组成部分是基于Transformer的、可泛化的稀疏视图…

kafka 入门

kafka 有分区和副本的概念&#xff0c;partition 3 表示有3个分区&#xff0c;replication 2 表示有2个副本 通过 --describe --topic test命令可以知道 test这个 主题的分区和副本情况&#xff0c;途中的replicas 表示 其他副本分区的情况&#xff0c;如第一条&#xff0c;t…

【spring】学习笔记2:sample、boot功能和组件设计

Spring自带了一个强大的Web框架,名为Spring MVC。Spring MVC的核心 是控制器(controller)的理念。控制器是处理请求并以某种方式进行信息 响应的类。在面向浏览器的应用中,控制器会填充可选的数据模型并将请求 传递给一个视图,以便于生成返回给浏览器的HTML。在pom.xml文件…

免费批量Excel文件合并、拆分软件

软件介绍 下载地址&#xff1a;https://pan.quark.cn/s/ae860a4e2ccb 1.多个XLS或XLSX格式EXCEL文件合并&#xff0c;合并后可使用数据透视表进行相关操作。 2.自动合并多个EXCEL文件的第一个工作表&#xff0c;并汇总成一张表&#xff0c;可根据所有列标题需要指定需要的列。 …

Ethernet 测试系列(1)-- 物理层测试::IOP Test::Link-up time

车载以太网物理层IOP测试&#xff0c;即互操作性测试&#xff08;Interop- erability Tests&#xff09;&#xff0c;用于验证车载以太网PHY&#xff08;通常也称为收发器&#xff09;的可靠性和检查PHY能否在给定的有限时间内建立稳定的链路;还用于车载以太网PHY的诊断&#x…

Unity编辑器扩展之Hierarchy面板扩展

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity编辑器扩展之Hierarchy面板扩展 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff…

JavaScript学习文档(11):Window对象、本地存储、数组中一些方法、学生就业统计表案例

目录 一、Window对象 1、BOM(浏览器对象模型) 2、定时器-延时函数 3、 JS执行机制 &#xff08;1&#xff09;同步任务&#xff1a; &#xff08;2&#xff09;异步任务&#xff1a; 4、location对象 &#xff08;1&#xff09;5秒钟后跳转页面 5、navigator对象 6、…

乐城堡 JoyCastle Unity岗位笔试题

1)实现 move(GameObjct gameObject, Vector3 begin, Vector3 end, float time, bool pingpong){ } 使 gameObject 在 time 秒内&#xff0c;从 begin 移动到 end&#xff0c;若 pingpong 为 true&#xff0c;则在结束时 使 gameObject 在 time 秒内从 end 移动到 begin&#xf…

FPGA上板项目(三)——RAM测试

目录 实验内容实验原理实验步骤实验用时序波形HDL 代码仿真综合实现上板测试 实验内容 对 FPGA 内部的 RAM 进行数据读写操作。 实验原理 RAM &#xff08;Random Access Memory&#xff09;&#xff0c;是可以进行数据交换的存储器&#xff0c;可读可写&#xff1b;而 ROM&…

操作系统:实验六文件操作实验

一、实验目的 1、了解文件系统功能及实现原理。 2、掌握LINUX下文件操作的有关系统调用。 3、熟悉main函数带参数运行的有关操作过程。 4、通过模拟程序实现简单的一级文件系统或二级文件系统。 二、实验内容 1、编程显示文件自身。&#xff08;1分&#xff09; #includ…

Java学习第五天

数组 数组适合做一批同类型数据的存储。 静态初始化数组&#xff1a; 注意&#xff1a;数组变量名中存储的是数组在内存中的地址&#xff0c;数组是引用类型。 数组的访问 动态初始化数组&#xff1a; 数组的遍历&#xff1a; 注意左边和右边的区别&#xff0c;一个是改变数组…

桥接与NET

仔细看看下面两幅图 net模式&#xff0c;就是在你的Windows电脑&#xff08;假设叫A电脑&#xff09;的网络基础上&#xff0c;再生成一个子网络&#xff0c;ip的前两位默认就是192.168&#xff0c;然后第三位是随机&#xff0c;第四位是自己可以手动设置的。使用这种模式唯一的…

grpc-spring 通信(选型,grpc-ecosystem/grpc-spring)

需求 需要一个在稳定网络环境里高性能且开发和部署成本较小&#xff0c;且多平台&#xff0c;且对视频传输和消息订阅和推送的支持比较好的&#xff0c; 一套环境 先说结论因为结论先得到的&#xff0c; 问AI了&#xff0c; 发现一个新东西gRPC ,看了下非常好。 再说过程&…

【2024 CCF编程能力等级认证(GESP)C++ 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 集成开发环境3.3 结构化程序设计3.4 程序的基本语句3.5 程序的基本概念3.6 基本运算3.7 基本数据类型4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…

OceanBase V4 技术解读:从Alter Table 看DDL的支持

背景 数据库类型可以划分为两大类&#xff1a;关系型数据库和非关系型数据库。而关系型数据库以表格形式进行数据组织&#xff0c;同时遵循表关系的约束&#xff0c;例如创建一张表&#xff0c;表里面包含多个列&#xff0c;不同的列可以有不同的类型。当需要改表结构&#xf…

数学建模赛前备赛——模拟退火算法

一.什么是智能优化算法 智能优化算法本质上是一个优化算法,它通过不断优化模型的参数,使得系统表现达到最优&#xff0c;常见的只能优化算法有很多&#xff0c;比如说蚁群算法,遗传算法以及我们今天的主角——模拟退火算法。 二.模拟算法的前身——爬山算法 爬山算法是一种简…

开放大世界的碰撞与物理

众所周知&#xff0c;物理开销一直是 CPU 的一个大头&#xff0c;而且还很容易出问题。对于开放世界&#xff0c;该如何进行物理运算&#xff0c;以及采用什么方案计算碰撞。 本文针对这个问题做了一些细微的研究&#xff0c;算是对 Unity 下的解决方案有了一个大致的方向。 1、…

Gartner报告解读:如何帮助企业完善数据分析与治理路线图

Gartner服务于全球100多个国家和地区的14,000余家机构&#xff0c;是一家深受客户信赖、观点客观的研究顾问公司。Garnter洞察、建议和工具可帮助您发现创新机遇&#xff0c;完成关键优先任务&#xff0c;助您成为企业不可或缺的战略专家和价值创造者。该公司是标普 500 指数成…