2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。
2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河
敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭
现在军队只找到了1只小船,这船最多能同时坐上2个士兵。
当1个士兵划船过河,用时为a[i]
当2个士兵坐船同时划船过河时, 用时为max(a[j],a[i])两士兵中用时最长的
当2个士兵坐船只有1个士兵划船时, 用时为a[i] * 10, a[i]为划船士兵用时
请帮忙给出一种解决方案,保证存活的士兵最多,且过河用时最短
我们先看一下如下的题,再讲一下华为OD的扩展
来自洛谷的P1809,过河问题。
有一个大晴天, Oliver与同学们一共N人出游, 他们走到一条河的东岸边,想要过河到西岸
而东岸边有一条小船。船太小了,一次只能乘坐两人,每个人都有一个渡河时间T
船划到对岸的时间等于船上渡河时间较长的人所用时间
现在已知N个人的渡河时间Ti
Oliver 想要你告诉他,他们最少要花费多少时间,才能使所有人都过河
注意,只有船在东岸(西岸)的人才能坐上船划到对岸。
来自华为OD。
答案2023-12-23:
来自左程云。
步骤描述如下:
1.初始化输入数据:定义一个整型切片inputs,包含每个士兵的过河时间。初始化n为inputs的长度。
2.对士兵的过河时间进行排序:使用sort包对inputs进行排序,以便后续计算最小花费时间。
3.初始化动态规划数组dp:定义一个大小为max(n, 3)的整型数组dp,用于存储每个状态下的最小花费时间。若n大于等于3,则初始化前三个元素dp[0]、dp[1]、dp[2]为对应士兵过河时间的和。
4.动态规划求解最小花费时间:从第3个士兵开始遍历到第n个士兵,对于每个士兵i,计算以下两种情况的最小值,并更新dp[i]:
a) 两个士兵同时过河:dp[i-2] + inputs[1] + inputs[0] + inputs[i] + inputs[1]
b) 一个士兵过河:dp[i-1] + inputs[i] + inputs[0]
5.返回最小花费时间:返回dp[n-1]作为最终的答案,即所有士兵都过河且花费时间最小的方案。
总的时间复杂度:排序士兵过河时间的时间复杂度为O(nlogn),动态规划遍历的时间复杂度为O(n),因此总的时间复杂度为O(nlogn)。
总的额外空间复杂度:除了输入外,使用了一个大小为MAXN的整型数组arr和dp,因此额外空间复杂度为O(MAXN)。
go完整代码如下:
package main
import (
"fmt"
"sort"
)
const MAXN = 100001
var arr [MAXN]int
var dp [MAXN]int
var n int
func main() {
inputs := []int{4, 6, 7, 10, 15}
ii := 0
n = inputs[ii]
ii++
for i := 0; i < n; i++ {
arr[i] = inputs[ii]
ii++
}
ans := minCost()
fmt.Println(ans)
}
func minCost() int {
sort.Ints(arr[:n])
if n >= 1 {
dp[0] = arr[0]
}
if n >= 2 {
dp[1] = arr[1]
}
if n >= 3 {
dp[2] = arr[0] + arr[1] + arr[2]
}
for i := 3; i < n; i++ {
dp[i] = min(
dp[i-2]+arr[1]+arr[0]+arr[i]+arr[1],
dp[i-1]+arr[i]+arr[0],
)
}
return dp[n-1]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}

rust完整代码如下:
use std::cmp;
const MAXN: usize = 100001;
static mut ARR: [i32; MAXN] = [0; MAXN];
static mut DP: [i32; MAXN] = [0; MAXN];
static mut N: usize = 0;
fn main() {
let inputs: Vec<i32> = vec![4, 6, 7, 10, 15];
unsafe {
let mut ii: usize = 0;
N = inputs[ii] as usize;
ii += 1;
for i in 0..N {
ARR[i] = inputs[ii];
ii += 1;
}
let ans = min_cost();
println!("{}", ans);
}
}
unsafe fn min_cost() -> i32 {
ARR[0..N].sort();
if N >= 1 {
DP[0] = ARR[0];
}
if N >= 2 {
DP[1] = ARR[1];
}
if N >= 3 {
DP[2] = ARR[0] + ARR[1] + ARR[2];
}
for i in (3..N).step_by(1) {
DP[i] = cmp::min(
DP[i - 2] + ARR[1] + ARR[0] + ARR[i] + ARR[1],
DP[i - 1] + ARR[i] + ARR[0],
);
}
return DP[N - 1];
}

c++完整代码如下:
#include <iostream>
#include <algorithm>
const int MAXN = 100001;
int arr[MAXN];
int dp[MAXN];
int n;
int minCost() {
std::sort(arr, arr + n);
if (n >= 1) {
dp[0] = arr[0];
}
if (n >= 2) {
dp[1] = arr[1];
}
if (n >= 3) {
dp[2] = arr[0] + arr[1] + arr[2];
}
for (int i = 3; i < n; i++) {
dp[i] = std::min(
dp[i - 2] + arr[1] + arr[0] + arr[i] + arr[1],
dp[i - 1] + arr[i] + arr[0]
);
}
return dp[n - 1];
}
int main() {
int inputs[] = { 4, 6, 7, 10, 15 };
int ii = 0;
n = inputs[ii++];
for (int i = 0; i < n; i++) {
arr[i] = inputs[ii++];
}
int ans = minCost();
std::cout << ans << std::endl;
return 0;
}

c完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100001
int arr[MAXN];
int dp[MAXN];
int n;
int compare(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
int minCost() {
qsort(arr, n, sizeof(int), compare);
if (n >= 1) {
dp[0] = arr[0];
}
if (n >= 2) {
dp[1] = arr[1];
}
if (n >= 3) {
dp[2] = arr[0] + arr[1] + arr[2];
}
for (int i = 3; i < n; i++) {
dp[i] = min(
dp[i - 2] + arr[1] + arr[0] + arr[i] + arr[1],
dp[i - 1] + arr[i] + arr[0]
);
}
return dp[n - 1];
}
int main() {
int inputs[] = { 4, 6, 7, 10, 15 };
int ii = 0;
n = inputs[ii++];
for (int i = 0; i < n; i++) {
arr[i] = inputs[ii++];
}
int ans = minCost();
printf("%d\n", ans);
return 0;
}

2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。的更多相关文章
- 12天学好C语言——记录我的C语言学习之路(Day 5)
12天学好C语言--记录我的C语言学习之路 Day 5: 第五天的学习开始了,今天我们主要对几个程序进行编写,让自己充分的熟练编程语言,大量的题目会让自己变的精炼.以一个程序(program 5.1) ...
- 12天学好C语言——记录我的C语言学习之路(Day 9)
12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...
- 12天学好C语言——记录我的C语言学习之路(Day 7)
12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...
- 12天学好C语言——记录我的C语言学习之路(Day 6)
12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n; scanf("%d,& ...
- 12天学好C语言——记录我的C语言学习之路(Day 4)
12天学好C语言--记录我的C语言学习之路 Day 4: 首先来看一段程序: //输出下面4*5的矩阵 /* 1 2 3 4 5 2 4 6 8 10 3 6 9 12 ...
- 12天学好C语言——记录我的C语言学习之路(Day 12)
12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...
- 12天学好C语言——记录我的C语言学习之路(Day 11)
12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...
- 12天学好C语言——记录我的C语言学习之路(Day 10)
12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...
- 12天学好C语言——记录我的C语言学习之路(Day 8)
12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...
- 12天学好C语言——记录我的C语言学习之路(Day 3)
12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...
随机推荐
- sqoop1.4.7完全支持Hadoop3.x, Hive3.x Hbase2.x
已经修改好 保存至云盘 自己下载 花了时间的,记得关注我... 链接:https://pan.xunlei.com/s/VNe6P6Tm1A9Q-RG5GByN08rdA1# 提取码:5nke 复制这 ...
- KRPANO资源分析工具下载720THINK全景图
提示:目前分析工具中的全景图下载功能将被极速全景图下载大师替代,相比分析工具,极速全景图下载大师支持更多的网站(包括各类KRPano全景网站,和百度街景) 详细可以查看如下的链接: 极速全景图下载大师 ...
- MPI转以太网Plus模块Modbus连接两台变频器通信案例
MPI转以太网Plus模块Modbus主站连接两台变频器通信案例 MPI转以太网Plus模块连接200PLC无需编程实现Modbus主从站功能与2台变频器modbus通信:以下就是MPI转以太网模块作 ...
- No module named virtualenvwrapper 虚拟环境报错
No module named virtualenvwrapper 虚拟环境报错 安装虚拟环境命令 sudo pip install virtualenv sudo pip install virtu ...
- Dubbo3应用开发—Dubbo服务管理平台DubboAdmin介绍、安装、测试
Dubbo服务管理平台 DubboAdmin的介绍 Dubbo Admin是Apache Dubbo服务治理和管理系统的一部分. Dubbo Admin提供了一套用于服务治理的Web界面,让我们可以更 ...
- P4032 [Code+#2] 火锅盛宴
prologue 树状数组推荐写法,感谢巨佬樱雪喵的教学. inline int lowbit(int x) { return x & -x; } inline void add(int x, ...
- 小景的工具使用--Java诊断工具Arthas的使用说明
小景最近在做程序和数据库的压测工作,期间监控压测数据,分析程序原因变成了一个待解决的问题,根据公司小伙伴的建议,接触了阿尔萨斯这个诊断工具,下面小景分别基于Linux操作系统和Windows操作系统, ...
- 入门篇-其之六-附录一-以Java字节码的角度分析i++和++i
前言:众所周知,i++和++i的区别是:i++先将i的值赋值给变量,再将i的值自增1:而++i则是先将i的值自增1,再将结果赋值给变量.因此,二者最终都给i自增了1,只是方式不同而已. 当然,如果在面 ...
- Golang后端大厂面经!
大家好,我是阳哥.专注Go语言的学习经验分享和就业辅导. 之前分享了很多 Golang 后端的大厂面经,不少同学在催更新,这篇给大家继续安排. 本文来自一位同学的投稿,面试深X服的面经汇总,前半部分主 ...
- CSS 元素居中方式总结
作者:WangMin 格言:努力做好自己喜欢的每一件事 在开发过程中,很多网页需求要求我们居中一个div,比如html文档流当中的一块div,比如弹出层内容部分这种脱离了文档流等.不同的情况有不同的居 ...