洛谷——P1809 过河问题_NOI导刊2011提高(01)

题目描述

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

船太小了,一次只能乘坐两人。每个人都有一个渡河时间T,船划到对岸的时间等于船上渡河时间较长的人所用时间。

现在已知N个人的渡河时间T,Oliver想要你告诉他,他们最少要花费多少时间,才能使所有人都过河。

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

输入输出格式

输入格式:

输入文件第一行为人数N,以下有N行,每行一个数。

第i+1行的数为第i个人的渡河时间。

输出格式:

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

输入输出样例

输入样例#1:

4 
6 
7 
10 
15 
输出样例#1:

42

说明

[数据范围]

对于40%的数据满足N≤8。

对于100%的数据满足N≤100000。

[样例解释]

初始:东岸{1,2,3,4},西岸{}

第一次:东岸{3,4},西岸{1,2} 时间7 第二次:东岸{1,3,4},西岸{2} 时间6 第三次:东岸{1},西岸{2,3,4},时间15 第四次:东岸{1,2},西岸{3,4} 时间7 第五次:东岸{},西岸{1,2,3,4} 时间7

所以总时间为7+6+15+7+7=42,没有比这个更优的方案。

思路:

对于一群人要过河,快的人一定是要迁就慢的人,也就是说两个人过河的时候他们过河时间就是他们中慢的那个人的所用的时间

对于每一种分配方式我们都可以在最后的时候剩下1,2,3个人这三种情况

若我们岸上剩的人的个数大于3个人时,我们每一次都拉两个人过河,这样不会把有种情况拉下(再说每次只能拉两个人)

对于岸上的人的个数大于3个的这种情况,我们可以这样想:

该情况要分两种情况:1。先让最快的两个人过去,然后让最快的那个人回来拉最慢的两个人。

有人可能会觉得这种情况就已经是最优情况(至少当时我是那么觉得)

但是!我们来看下面的一个例子:1   2   10   13

    对于这种情况,我们让最快的两个人过河和然后再让最快的人回来拉最慢的那两个人,这样所用的时间就是:2+1+10+1+13

这样的话是不是就不如:我们先让最快的两个人过河,然后再让最快的人回来,让最快的人留在岸上,先让最慢的两个人搭伙过河,然后

再让第二快的人回来接最快的人所用的时间:2+1+13+2所用的时间少?!

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100001
#define maxn 123456
using namespace std;
int n,t[N],ans,s;//s为在西岸上剩下的人的个数,ans为总共用的时间
int main()
{
    scanf("%d",&n);
    ;i<=n;i++)
      scanf("%d",&t[i]);
    sort(t+,t++n);//先进行排序
    s=n;
    while(s)
    {
        )
        {
            ans+=t[];
            break;
        }
        )
        {
            ans+=t[];
            break;
        }
        )
        {
            ans+=t[]+t[]+t[];
            break;
        }
        )
        {
            ans+=min(t[]+t[]+t[]+t[s],t[s]+t[s-]+t[]*);
            s-=;
        }
    }
    printf("%d",ans);
    ;
 } 

贪心—— P1809 过河问题_NOI导刊2011提高(01)的更多相关文章

  1. 洛谷P1809 过河问题_NOI导刊2011提高(01)

    To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...

  2. luogu P1809 过河问题_NOI导刊2011提高(01)

    题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡 ...

  3. P1809 过河问题_NOI导刊2011提高(01)

    题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡 ...

  4. P1836 【数页码_NOI导刊2011提高(04)】

    P1836 数页码_NOI导刊2011提高(04) 题目描述 一本书的页码是从1—n编号的连续整数:1,2,3,…,n.请你求出全部页码中所有单个数字的和,例如第123页,它的和就是1+2+3=6. ...

  5. 洛谷 P1808 单词分类_NOI导刊2011提高(01)

    P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当 ...

  6. 洛谷P1808 单词分类_NOI导刊2011提高(01) 字符串排序

    洛谷P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且 ...

  7. 公共子序列_NOI导刊2011提高(03)题

    题面 这道题有点坑人啊~ 首先,它需要取模,模数是100000000:(窝在这里死了好久好久,看了别人的代码才发现这一点) 然后我发现题解中没有序列自动机的方法,于是就来一发 首先,虽然序列自动机在定 ...

  8. P1835 素数密度_NOI导刊2011提高(04)

    题目描述 给定区间[L,R](L≤R≤2147483647,R-L≤1000000),请计算区间中素数的个数. 输入输出格式 输入格式: 两个数L和R. 输出格式: 一行,区间中素数的个数. 输入输出 ...

  9. 单人纸牌_NOI导刊2011提高(04)

    单人纸牌 时间限制: 1 Sec  内存限制: 128 MB 题目描述 单人纸牌游戏,共 36 张牌分成 9 叠,每叠 4 张牌面向上.每次,游戏者可以从某两个不同的牌堆最顶上取出两张牌面相同的牌(如 ...

随机推荐

  1. html5音频audio对象封装成vue组件的方式调用以及setTimeout如何在vue2生效 (vue2正在熟悉中,ajax还是用jQuery来写舒服些,里面含有一些php写法可略过) 此网页应用在PC不考虑手机端

    // vue2 组件封装如下: <template> <div> <div><!--vue element 组件的引用 Switch 开关 不懂请自行百度(重 ...

  2. python多进程并发进程池Pool

    简介: python中的多进程主要使用到 multiprocessing 这个库.低版本python这个库在使用 multiprocessing.Manager().Queue时会出问题,建议大家升级 ...

  3. Python入门学习笔记2:刷题

    1) LeetCode 强的面试题和算法题,要求也比较高,很多国内外的码农在上面刷题.难度从easy到hard都有,而且覆盖面极广,需要你的综合实力去答题. 最简单的题比如字符串的处理有的时候也要用到 ...

  4. Linux学习-Linux 的开机流程分析

    开机流程一览 系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置; 读取并执行第一个开机装置内 MBR 的 boot Loader (亦 ...

  5. webdriver高级应用- 无人工干预地自动下载某个文件

    在网页上下载文件时,通常需要人为设定下载文件并选择保持路径,这样就无法实现完全自动的下载过程.下面实现基于firefox浏览器的全自动化文件下载操作: #encoding=utf-8 from sel ...

  6. 一张图展示:用两个栈来实现一个队列,完成队列的Push和Pop操作

    一  基本思路 将s1作为存储空间,以s2作为临时缓冲区. 入队时,将元素压入s1. 出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒 ...

  7. 【Go】Panic函数

    panic(运行时恐慌)是一种只会在程序运行时才回抛出来的异常.在panic被抛出之后,如果没有在程序里添加任何保护措施的话,程序就会在打印出panic的详情,终止运行. 如果一个panic是无意间引 ...

  8. git命令综合

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势.Git常用操作命令:1) 远程仓库相关命令检出仓库:$ git clone git: ...

  9. iOS-ARC机制

    内存管理是开发软件中重要的一个课题.如果内存管理不当,轻者内存泄露,重者程序崩溃. 下面重要讲述一下iOS的ARC(Automatic Reference Counting))机制. ARC的历史由来 ...

  10. 【python自动化】python 常用时间获取方法

    代码如下: import datetime import time DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" DATE_FORMAT = &quo ...