2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河

敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭

现在军队只找到了1只小船,这船最多能同时坐上2个士兵。

  1. 当1个士兵划船过河,用时为a[i]

  2. 当2个士兵坐船同时划船过河时, 用时为max(a[j],a[i])两士兵中用时最长的

  3. 当2个士兵坐船只有1个士兵划船时, 用时为a[i] * 10, a[i]为划船士兵用时

请帮忙给出一种解决方案,保证存活的士兵最多,且过河用时最短

我们先看一下如下的题,再讲一下华为OD的扩展

来自洛谷的P1809,过河问题。

有一个大晴天, Oliver与同学们一共N人出游, 他们走到一条河的东岸边,想要过河到西岸

而东岸边有一条小船。船太小了,一次只能乘坐两人,每个人都有一个渡河时间T

船划到对岸的时间等于船上渡河时间较长的人所用时间

现在已知N个人的渡河时间Ti

Oliver 想要你告诉他,他们最少要花费多少时间,才能使所有人都过河

注意,只有船在东岸(西岸)的人才能坐上船划到对岸。

来自华为OD。

答案2023-12-23:

来自左程云

灵捷3.5

步骤描述如下:

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个士兵。的更多相关文章

  1. 12天学好C语言——记录我的C语言学习之路(Day 5)

    12天学好C语言--记录我的C语言学习之路 Day 5: 第五天的学习开始了,今天我们主要对几个程序进行编写,让自己充分的熟练编程语言,大量的题目会让自己变的精炼.以一个程序(program 5.1) ...

  2. 12天学好C语言——记录我的C语言学习之路(Day 9)

    12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...

  3. 12天学好C语言——记录我的C语言学习之路(Day 7)

    12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...

  4. 12天学好C语言——记录我的C语言学习之路(Day 6)

    12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n;   scanf("%d,& ...

  5. 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 ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  7. 12天学好C语言——记录我的C语言学习之路(Day 11)

    12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 10)

    12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

  10. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

随机推荐

  1. LeetCode 周赛上分之旅 #46 经典二分答案与质因数分解

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  2. JavaAgent寄生在目标进程中引起的ClassNotFoundException

    今天有解决方案部的小伙伴反映,我公司XWind产品在分析客户应用程序的潜在性能问题时,总是显现诊断任务异常,为了定位问题的根因,我们马上要求解决方案部的小伙伴提供XWind相关的日志,从日志中找到了如 ...

  3. Solution -「洛谷 P2044」「NOI 2012」随机数生成器

    Description Link. 给你一个递推式,让你求某一项的值模上 \(g\). Solution 这道题正解是矩阵.我这里给出一种分治的做法. 题目中说 $\ \ \ \ \ \ \ $ $\ ...

  4. 高可用mongodb集群(分片+副本):规划及部署

    目录 ■■ 概述 ■ 下图是一个典型的3节点分片副本集群 ■ Mongos Server ■ config server ■ shard server ■ replica set ■ 仲裁者(Arbi ...

  5. P9140 [THUPC 2023 初赛] 背包

    prologue 这很难评(调了我 1h,我都想紫砂了. 还是典型得不重构就看不见系列. analysis 如果我们还是一个正常人,那么我们大体上是能看到题目的加粗字,这个格式很明显符合我们的同余最短 ...

  6. nvm的安装及使用(入门级)

    1 从官网下载压缩包到本地 下载地址: https://github.com/coreybutler/nvm-windows/releases 2 配置 2.1 settings.txt配置 (1)下 ...

  7. 初探富文本之React实时预览

    初探富文本之React实时预览 在前文中我们探讨了很多关于富文本引擎和协同的能力,在本文中我们更偏向具体的应用组件实现.在一些场景中比如组件库的文档编写时,我们希望能够有实时预览的能力,也就是用户可以 ...

  8. 基于LangChain的LLM应用开发1——介绍

    这是基于LangChain的大语言模型应用开发系列的第一篇. 文章内容会参考deeplearning.ai的短课程(https://learn.deeplearning.ai/langchain/), ...

  9. CF671D Roads in Yusland 题解

    题目链接 题目要求我们求出选出若干条路径并最小化花费,如果这是在链上,我们可以考虑直接枚举每条路径的右端点 dp,那树呢?把路径剖分整个覆盖的集合就不一定连续了,没法 dp,况且题目里给了很强的条件: ...

  10. 前端脚手架CLI生成模版命令工具(包括,npm包的发布,脚手架的搭建,注意事项,优化等)

    写在前面 这是停更以后,续更的一篇文章. 为什么好长时间都没有更新,因为去其他平台更新了,包括掘金,思否,简书等. 在那些地方感觉没有归属感,有的平台原创审核很麻烦,简书号称可以获得打赏,可是码了几十 ...