贪心—— P1809 过河问题_NOI导刊2011提高(01)

洛谷——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);
    for(int i=1;i<=n;i++)
      scanf("%d",&t[i]);
    sort(t+1,t+1+n);//先进行排序
    s=n;
    while(s)
    {
        if(s==1)
        {
            ans+=t[1];
            break;
        }
        if(s==2)
        {
            ans+=t[2];
            break;
        }
        if(s==3)
        {
            ans+=t[1]+t[2]+t[3];
            break;
        }
        if(s>3)
        {
            ans+=min(t[1]+t[2]+t[2]+t[s],t[s]+t[s-1]+t[1]*2);
            s-=2;
        }
    }
    printf("%d",ans);
    return 0;
 } 
时间: 2024-08-02 02:51:04

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

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

题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T,船划到对岸的时间等于船上渡河时间较长的人所用时间. 现在已知N个人的渡河时间T,Oliver想要你告诉他,他们最少要花费多少时间,才能使所有人都过河. 注意,只有船在东岸(西岸)的人才能坐上船划到对岸. 输入输出格式 输入格式: 输入文件第一行为人数N,以下有N行,每行一个数. 第i+1行的数为第i个人的渡河时间. 输出格式

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

P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等. 例如“AABAC”,它和“CBAAA”就可以归为一类,而和“AAABB”就不是一类. 现在Oliver有N个单词,所有单词均由大写字母组成,每个单词的长度不超过100.你要告诉Oliver这些单词会被分成几类. 输入输出格式 输入格式: 输入文件的第一行为单词

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

题目描述 单人纸牌游戏,共36张牌分成9叠,每叠4张牌面向上.每次,游戏者可以从某两个不同的牌堆最顶上取出两张牌面相同的牌(如黑桃10和梅花10)并且一起拿走.如果最后所有纸牌都被取走,则游戏者就赢了,否则游戏者就输了. George很热衷于玩这个游戏,但是一旦有时有多种选择的方法,George就不知道取哪一种好了,George会从中随机地选择一种走,例如:顶上的9张牌为KS,KH,KD,9H,8S,8D,7C,7D,6H,显然有5种取法:(KS,KH),(KS,KD),(KH,KD),(8S,

[luoguP1835] 素数密度_NOI导刊2011提高(04)(素数筛)

传送门 数据辣么大,怎么搞?(L≤R≤2147483647) 注意到R-L≤1000000 所以可以直接筛R-L区间内的数, 但是需要用已知的小的素数筛, R-L区间内的大部分数肯定能用较小的素数筛去,但是还有一些较大的数,可能等于两个大质数的乘积,没法被筛去. 但是又注意到,数据最大才10位,也就是说我们只需要用位数<=5的素数筛就可以了,所以先预处理出来,直接筛就ok了. #include <cstdio> #define N 1000001 #define max(x, y) ((

洛谷 P1835 素数密度_NOI导刊2011提高(04)题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1835 题目描述 给定区间[L,R](L≤R≤2147483647,R-L≤1000000),请计算区间中素数的个数. 输入输出格式 输入格式: 两个数L和R. 输出格式: 一行,区间中素数的个数. 输入输出样例 输入样例#1: 2 11 输出样例#1: 5 分析:裸的区间素数筛.代码中有详细注释(其中区间素数筛函数大部分借用了<挑战程序

Luogu P1836 数页码_NOI导刊2011提高(04)

题目描述 一本书的页码是从1-n编号的连续整数:1,2,3,-,n.请你求出全部页码中所有单个数字的和,例如第123页,它的和就是1+2+3=6. 输入输出格式 输入格式: 一行为n(1≤n≤1O^9). 输出格式: 一行,代表所有单个数字的和. 输入输出样例 输入样例#1: 3456789 输出样例#1: 96342015  Solution 本题是让我们求1~n这n个数所有单个数字的和,我们可以试着把每一位所有出现过的数字的和先求出来,然后把每一位的答案加起来就是最终的答案了. 我们就看"3

luoguP1774 最接近神的人_NOI导刊2010提高(02)x

P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即

P1807 最长路_NOI导刊2010提高(07)

P1807 最长路_NOI导刊2010提高(07) 题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入输出格式 输入格式: 输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v). 输出格式: 输出文件longest.out,一个整数,即1到n之间的最长路径.如

洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]

P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即