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. mysql关键字匹配度模糊查询

    有时候项目中需要进行模糊查询,但是要对查询出来的结果进行匹配度排序,比如搜索关键字是"北",需要把数据库中第一个字是北的排在前面,此时就可以用mysql的INSTR函数. INST ...

  2. 推荐vue脚手架工具 vue-cli

    安装vue-cli之前,需要先装好vue 和 webpack npm install -g vue //全局安装vue npm install -g webpack //全局安装webpack npm ...

  3. 【目标检测】RCNN算法实现

    一.前言 RCNN(Regions with CNN features)算法由Ross Girshick在2014年的论文"Rich feature hierarchies for accu ...

  4. Kafka Stream 高级应用

    9.1将Kafka 与其他数据源集成 对于第一个高级应用程序示例,假设你在金融服务公司工作.公司希望将其现有数据迁移到新技术实现的系统中,该计划包括使用 Kafka.数据迁移了一半,你被要求去更新公司 ...

  5. 2017-D

    2017-D 数据库部分 使用Windows 身份验证登录SQL Server ,建立数据库test0322,文件日志保存到一个专门的文件夹 建表 备份数据库,选定所创建数据库,右键-任务-备份-选择 ...

  6. ConcurrentHashMap底层源码分析

    ConcurrentHashMap源码底层分析 1.ConcurrentHashMap初始化 jdk8之后,ConcurrentHashMap采用了HashMap的底层结构(数据,链表,红黑树),在此 ...

  7. SpringBootAdmin_监控

    监控的意义 监控服务状态是否宕机 监控服务运行指标(内存.虚拟机.线程.请求等) 监控日志 管理服务(服务下线) 监控的实施方式 大部分监控平台都是主动拉取监控信息,而不是被动地等待应用程序传递信息 ...

  8. 其它——各主流Linux系统解决pip安装mysqlclient报错

    文章目录 一 CentOS(红帽) 二 Ubuntu 三 Windows 一 CentOS(红帽) #CentOS有Python.Mysql的开发工具包,安装后使用pip安装mysqlclient即可 ...

  9. MySQL5.7版本单节点大数据量迁移到PXC8.0版本集群全记录-2

    本文主要记录57版本升级80版本的过程,供参考. ■ 57版本升级80版本注意事项 默认字符集由latin1变为utf8mb4 MyISAM系统表全部换成InnoDB表 sql_mode参数默认值变化 ...

  10. salesforce零基础学习(一百三十三)ListView的button思考

    本篇参考: salesforce零基础学习(九十五)lightning out salesforce零基础学习(一百一十)list button实现的一些有趣事情 https://help.sales ...