首页 > 其他分享 >5944: 小船过河 经典贪心

5944: 小船过河 经典贪心

时间:2023-07-08 10:57:05浏览次数:49  
标签:5944 过河 int else break ans 速度 贪心

描述

 

 

N个人要过河,但只有一条小船,每次只能坐2人,每个人有不同的划船速度,而两个人一起过河时小船速度由最慢的人的速度决定。请设计一个过河方案,使得所有人均过河,且所用总时间最少。

 

 

 

输入

 

 

第一行为正整数N(N<=1000),表示人数,第二行为N个正整数,表示每个人的速度(这里是时间值,值越小速度越快),不超过100。

 

 

输出

 

 

输出花费最少的总时间。

 

 

样例输入

 

4
1 2 5 10

样例输出

 

17

 

先对n个人的速度进行从小到大排序,对于要过河的n个人需要分类讨论

n = 1时,很明显速度就是a[1]

n = 2时,速度是a[2]

n = 3时,最快就是1和n过河,1回来,再和2过去,速度是a[n]+a[1]+a[2]

n = 4时,有两种不同情况,但是两种情况都是要每次送两个人

1. 一直让1号和n号划船,让1号回来;

那么一轮就是 a[n]+a[1]+a[n-1]+a[1]

2.让1号和2号这两个最快和次快过去,然后最快回来,再让最慢的两个n号和n-1号过去,再让次快的2号划船回来;

那么一轮就是 a[2]+a[1]+a[n]+a[2]

然后比较两种情况的最小值相加起来即可,记得要每次n减去2人,这样才能保证n和n-1是最慢和次慢

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10,inf = 0x3f3f3f3f;
int a[N];
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    int ans = 0;
    while(n)
    {
        if(n==1)
        {
            ans += a[1];break;
        }
        else if(n==2)
        {
            ans += a[2];break;
        }
        else if(n==3)
        {
            ans += a[1]+a[2]+a[3];break;
        }
        else
        {
            ans  = ans+min(a[n]+a[1]+a[n-1]+a[1],a[2]+a[1]+a[n]+a[2]);
            n-=2;
        }
    }
    cout<<ans;
     return 0;
}

 

 

 

 

 

标签:5944,过河,int,else,break,ans,速度,贪心
From: https://www.cnblogs.com/jyssh/p/17536845.html

相关文章

  • 【搜索】 FZU 2188 过河I
    bfs搜索,x,y和船停的地方。#include<iostream>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<cstdio>#include<algorithm>#include<cstring>#include<climits>......
  • YBTOJ 1.2贪心算法
    A.奶牛晒衣服......
  • 算法——暴力、贪心策略
    暴力贪心算法是一种基于贪心思想的算法,它的主要思想是在问题求解的过程中,尽可能地采取局部最优策略,从而得到全局最优解。暴力贪心算法的技巧包括:确定问题的最优解结构:对于一个问题,如果它具有最优子结构的性质,那么就可以使用贪心算法来求解。最优子结构的性质是指问题的最优解可......
  • 24.贪心算法.
    贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。请看下面案例,假设有如下课程,希望尽可能多的将课程安排在一间教室里:课程开始时间结束时间美术9:0010:00英语9:3010:30......
  • Dreaming of Freedom(数论,贪心)
    用nsqrt(n)的时间复杂度就能过//DreamingofFreedom:https://codeforces.com/problemset/problem/1826/C#include<bits/stdc++.h>//#defineintlonglongusingnamespacestd;constintN=1e5+10,mod=1e9+7;strings;intn,t,a[N],f[N],res,num,ans,m;boolvis[N];i......
  • 基础算法:二分,贪心等 学习笔记
    普及组基础算法这些都是零零散散接触过的基础算法,写个笔记把这些整理到一起来。线性降维技巧之前在学校洛谷团队里看到一个题单,觉得这些技巧可能有用,就转存了。前缀和差分前缀和是一种对区间求和问题进行降维的方法。具体地,对于给定数组\(A[n]\),求出\(A[l,r]\)区间和这个......
  • 代码随想录Day32|贪心II
     今日任务●  122.买卖股票的最佳时机II ●  55. 跳跃游戏 ●  45.跳跃游戏II ●  1005.K次取反后最大化的数组和 ●  134. 加油站●  135. 分发糖果 122.买卖股票的最佳时机IIclassSolution:defmaxProfit(self,prices:List[int]......
  • 代码随想录Day30|贪心1
       理论基础 ●  455.分发饼干 ●  376. 摆动序列 ●  53. 最大子序和什么是贪心贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结......
  • 【计算机算法设计与分析】最优子结构和贪心选择性质的证明
    最优子结构性质(反证法)计算某问题的最优解包含的计算该问题的子问题也是最优解。事实上,如果找到子问题的更优解,则可以替换当前子问题的解,得到一个比最优解更优的解,这是一个矛盾。贪心选择性质(数学归纳法)先设一个最优解(为所给定的总元素集合,且和均按照某种有利于算法贪心进行的顺序......
  • P1969 积木大赛(C++_贪心_模拟)
    题目描述春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是。在搭建开始之前,没有任何积木(可以看成n块高度为0的积木)。接下来每次操作,小朋友们可以选择一段连续区间,然后将第第L块到第R......