首页 > 其他分享 >2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。

2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。

时间:2024-01-04 12:00:48浏览次数:32  
标签:inputs arr 23 int ii MAXN 士兵 go dp


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:

步骤描述如下:

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
}

2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。_golang

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];
}

2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。_i++_02

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;
}

2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。_算法_03

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个士兵。_golang_04


标签:inputs,arr,23,int,ii,MAXN,士兵,go,dp
From: https://blog.51cto.com/moonfdd/9098473

相关文章

  • Oracle Database 23c Free - Developer Release 免费的 Oracle 数据库开发者版本下载
    免费的Oracle数据库开发者版本作者主页:sysin.orgOracleDatabase23cFree-DeveloperRelease是一个全新的、免费的、业界领先的Oracle数据库,全世界各个行业的企业每天都在使用它。无需oracle.com帐户即可下载,可以通过这个世界领先的简单、快速的融合数据库,支持所有数据模......
  • JetBrains AppCode 2023.1 (macOS x64、aarch64) - 适用于 iOS/macOS 开发的智能 IDE
    Xcode14.3compatibility,Swiftrefactoringsandintentions,theIDE’sUI,andKotlinMultiplatformMobile.作者主页:sysin.orgJetBrainsAppCode-适用于iOS/macOS开发的智能IDEAppCode2023现已推出,立即了解最新变化为什么选择AppCode得益于对代码结构的深刻理解,Ap......
  • Mongo Express web浏览器直观界面 管理和操作MongoDB数据库
    MongoExpress是一个基于Web的MongoDB管理员界面工具,使用Node.js和express编写。它提供了一个直观的界面,帮助用户轻松管理和操作MongoDB数据库MongoExpress是一个基于Web的MongoDB管理员界面工具,使用Node.js和express编写。它提供了一个直观的界面,帮助用户轻松管理和操作MongoDB......
  • 深入分析 Java、Kotlin、Go 的线程和协程
    文章目录前言协程是什么协程的好处进程进程是什么进程组成进程特征线程线程是什么线程组成任务调度进程与线程的区别线程的实现模型一对一模型多对一模型多对多模型线程的“并发”协程协程的目的协程的特点协程的原理Java、Kotlin、Go的线程与协程Kotlin的协程使用「线程」的代......
  • Mongo 数据库备份和恢复命令
    转载请注明出处:在MongoDB中,使用mongodump和mongorestore命令来备份和恢复数据库mongodump1.使用方法:使用 mongodump 命令可以备份MongoDB数据库的数据。2.常用参数:使用mongodump--help查看所有帮忙参数,以下为常用的一些参数:-h,--host:代表远程连接的数据库地址,默认连接......
  • go依赖的版本管理
    在Go语言的项目中,要将依赖升级到最新版本,你可以使用goget命令。以下是一些常用的步骤和命令:更新单个依赖到最新版本:goget-upackage-name这里package-name是你想要更新的依赖包名。这个命令会将指定的依赖更新到最新版本。更新所有依赖到最新版本:goget-u./...这个命......
  • 2023年互联网公司年度崩盘报告
    2023年互联网公司年度崩盘报告B站崩了两次2023年3月5日晚20:20左右,许多网友表示在使用B站时,手机和电脑端都无法访问视频详情页,且手机端无法查看收藏夹与历史记录。8月4日晚间,距离上次事故5个月后,又有许多网友反馈B站图片(视频封面)无法加载、视频无法打开、视频一直在缓冲。唯......
  • CCS2023--从0到1打造k8s威胁检测可信纵深体系
    本议题公开发布于CCS-2023成都网络安全大会云安全论坛。......
  • 【Django开发】美多商城项目第1篇:项目结构设计和工程创建(附代码,已分享)
    本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django+Jinja2模板引擎+Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsgi......
  • Golang Defer 必会知识点
    Golang中的一个关键字,用于延迟执行指定的函数调用。在程序执行到defer语句时,该函数调用会被推迟到当前函数返回之前执行,无论当前函数是正常返回还是发生异常退出。Defer语句可以用来在函数执行完毕后清理资源,确保资源的释放不会被遗漏。通过使用defer,我们能够更好地管理和控......