首页 > 其他分享 >OpenJudge702 Crossing River过河问题

OpenJudge702 Crossing River过河问题

时间:2023-02-19 21:36:45浏览次数:49  
标签:方案 过河 OpenJudge702 int 最快 Crossing River 回来

题目链接:702:Crossing River
题目大意为有n个人要过河,船最多乘两个人,给出每个人乘船时间,两人乘船时间由更慢者决定。求过河最短时间。有t组数据,输入数据组数t,对于每组数据,第一行输入总人数n,然后给出每个人乘船所需时间。输出要求每组数据单独一行,输出最短时间。

建立数学模型

首先我们建立起这道题的数学模型,两人去还要一人回来继续拉剩下的人,最快的方式无非就两种

  1. 最快的把最慢的拉过去,最快的回来。依次这样下去,最终只剩下两个人一起过去不再回来
  2. 最快的人把次快的拉过去,最快(次快)的回来,最慢和次慢一起过去,次快(最快)的再把船运回来
    反正最快的和次快的在这里就是工具人,自己不过去,只是因为速度快把船运回来
    因为他们都要回来,所以第一次回来和第二次回来最快和次快的顺序不用考虑

如果前面的人过河都很快,后面只有几个人要吭哧吭哧地慢慢过河,前面的人就适用于第一种办法,后面的人就适合用第二种。不能只从主观判断一定是方案1好还是方案2好,而就要靠计算机擅长于重复选择来找到最优解。

设计算法

由以上分析,我们知道了过河有两种办法,要么选1要么选2,要根据实际状况选择……听到这,你想到了什么?没错,就是动态规划

动态规划三要素来看,本题的三要素为:

  • 阶段:题目中只有一艘船,减少了一个维度
  • 状态:有多少个人需要过河就是本体的状态
  • 决策:上文提到的方案1或方案2

算法实现

先要把所有人按照过河时间排一遍序,便于我们知道谁最慢谁最快
先\(f[1]=a[1], f[2]=a[2]\),只有一个人或只有两个人时的答案是显而易见的
状态循环,从3到n循环一遍。如果选方案1,相当于多了一个人过河,找到多一个人前的状态并加上方案1所需时间,所需总时间为\(f[i-1]+a[i]+a[1]\);如果选方案2,相当于多了两个人过河,找到多两个人之前的状态再加上方案2所需时间,所需总时间为\(f[i-2]+a[2]+a[1]+a[i]+a[2]\)

最后附上我的代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t,n,a[1005],f[1005];
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++) cin>>a[i];
		sort(a+1,a+1+n);
		f[1]=a[1];
		f[2]=a[2];
		for(int i=3;i<=n;i++){
			f[i]=min(f[i-1]+a[i]+a[1]/*最快最慢去最快回*/,f[i-2]+a[2]+a[1]+a[i]+a[2]/*最快次快去最快回,最慢次慢去次快回*/);
		}
		cout<<f[n]<<endl;
	}
	return 0;
}

标签:方案,过河,OpenJudge702,int,最快,Crossing,River,回来
From: https://www.cnblogs.com/SkyNet-PKN/p/17135634.html

相关文章

  • Clock Domain Crossing
    ClockDomainCrossingCDC问题主要有亚稳态问题,多比特信号同步,握手信号同步,异步Fifo....TopicsDescribetheSoCDesignIssuesUnderstandthetranditonalverifi......
  • scout-elasticsearch-driver + laravel Demo学习
    项目地址:​​https://github.com/yb19890724/laravel-es​​1。在本地穿件数据库,修改.env的信息我的env文件​​点击下载​​2。env中配置es的地址。3.根目录下执行compo......
  • 关于 The River All Red (Tr.许渊冲) 的一点感想
    在许渊冲先生翻译的《满江红·写怀》TheRiverAllRed中,对于词句“三十功名尘与土,八千里路云和月”的翻译,许老是写为Todustisgonethefameachievedatthirtyyea......
  • selenium webdriver 实例化对象的常用属性和方法
    1.获取当前标签页浏览器渲染之后的网页源代码driver.page_source2.获取当前标签页urldriver.get_url3.关闭当前标签页(如果只有一个标签页则关闭整个浏览器)......
  • Kubernetes CSI插件注册(一)—— node-driver-registrar源码分析
    1、概述node-driver-registrar是一个由官方K8ssig小组维护的辅助容器(sidecar),它的主要作用则是获取CSI插件信息并通过GRPC服务(即RegistrationServer)向Kubelet提供插件......
  • 数据库必知必会:TiDB(7)Placement Driver
    (数据库必知必会:TiDB(7)PlacementDriver)PlacementDriverPD的架构PD集群也是主从结构的,有一个leader,另外的节点是follower。集成了ETCD,其Raft协议保证了数据的一致性。......
  • Linux Char-Driver (字符驱动 摘要)(一)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • Codeforces Round #472 D - Riverside Curio 差分约束
    正解据说是贪心+dp可惜我这个人没什么脑子:)(遇到了能用差分约束也能用dp+贪心的第二题了,真是神奇假设有一组合法的sum就能逆推出di,因为ai+di+1=sumi最小化Σdi就是最小......
  • Java利用ChromeDriver插件网页截图(Wondows版+Linux版)
    **chromedriver是谷歌浏览器驱动,用来模拟谷歌运行操作的一个工具,本文主要讲解Java后端利用此插件进行网页截图,并且适配Linux部署。**环境准备Wondows服务器或电脑本机......
  • 关闭selenium开发中的chromedriver控制台
    采用selenium操作浏览器执行自动化操作的场景时,在使用pyinstaller打包成exe文件后,会有chromedriver.exe或geckodriver.exe的console命令行窗口。我们打包成exe文件一......