列表

详情


NC207781. 迁徙过程中的河流

描述

牛市的幸存的先民在流星雨之后就忍痛离开了这片土地,选择迁徙,在迁徙的途中,他们需要渡过一条河。因为牛市的树木在流星雨中被严重破坏,所以他们只造出了一艘小船,船太小了,一次只能乘坐两人。
牛市的先民们每个人划船的速度都不尽相同,所以每个人都有一个渡河时间T,为了保证船的平衡,当穿上有两个人的时候,需要他们按照慢的那个人的速度划船,也就是说船到达对岸的时间等于船上渡河时间长的那个人的时间。
现在已知N个人的渡河时间T,请问最少要花费多少时间,才能使所有人都过河。

输入描述

输入文件第一行为先民的人数N,以下有N行,每行一个整数为每个人的渡河时间。

输出描述

输出文件仅包含一个数,表示所有人都渡过河的最少渡河时间。

示例1

输入:

4
5
7
11
16

输出:

42

说明:

首先1,2先到河对岸花费7,然后1回来花费5,3,4到河对岸花费16,2回来花费7,1,2再到河对岸花费7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 28ms, 内存消耗: 1132K, 提交时间: 2022-09-04 15:38:59

#include<iostream>
using namespace std;
const int N=100000+5;
int t[N];
int d[N];
int main(){
  int n;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>t[i];
  }
  d[0]=t[0];
  d[1]=t[1];
  for(int i=2;i<n;i++){
    d[i]=min(d[i-1]+t[0]+t[i],d[i-2]+t[0]+t[i]+2*t[1]);
  }
  cout<<d[n-1];
}

Python3(3.5.2) 解法, 执行用时: 98ms, 内存消耗: 12140K, 提交时间: 2020-06-12 11:13:03

from sys import stdin as inn
n=int(input())
a,s=[],0
a.extend(sorted(map(int,inn.read().split("\n")[:-1])))
while len(a)>3:
    s+=min(a[0]+a[1]*2+a[-1],a[0]*2+a[-2]+a[-1])
    a.pop()
    a.pop()
if len(a)==3: print(s+sum(a))
else: print(s+a[-1])

pypy3 解法, 执行用时: 295ms, 内存消耗: 30008K, 提交时间: 2023-05-26 21:08:00

n = int(input())
arr = [int(input()) for _ in range(n)]

arr.sort()
dp = [999999999]*n
dp[0] = arr[0]
dp[1] = arr[1]
for i in range(2,n):
    dp[i] = min(arr[0]+arr[i]+dp[i-1], dp[i-2]+arr[i]+arr[0]+2*arr[1])
    
print(dp[-1])

上一题