cqyz oj | 潜水比赛 | 贪心

Description

  在马其顿王国的ohide湖里举行了一场潜水比赛.其中一个项目是从高山上跳下水,再潜水到达终点.这是一个团体项目,一支队伍由n个人组成.在潜水时必须使用氧气瓶,但是每支队伍只有一个氧气瓶.最多两个人同时使用一个氧气瓶,但此时两人必须同步游泳,因此到达终点的时间等于较慢的一个单独游到终点所需要的时间.好在大家都很友好,因此任何两个人都愿意一起游泳.安排一种潜水策略,使得最后一名选手尽早到达终点。

Input

  第1行:一个整数n,表示队伍的人数。  以下n行,每行一个整数,表示第i个人游到终点的时间Ti(0<=n,Ti<=1000)。

Output

  队伍最早到达终点的时间。

Sample Input 1

3
1
3
4

Sample Input 2

6
1
2
5
6
8
9

Sample Output 1

8

Sample Output 2

27



这题隐含了题意:瓶子去了得有人潜水送回来

先排序
至少有4个人的时候,2种贪心策略取最优:
1、最快的人把最慢的两个人分别运过去再回来,耗时T[n]+T[1]+T[n-1]+T[1]
2、最快和次快的人先过去,其中一个回来,最慢的两个一起过去,另一个再把瓶子带回来,耗时T[2]+T[2]+T[n]+T[1]

#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int a[1005],sum=0;
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    while(n>=4){
        sum+=min(a[1]*2+a[n]+a[n-1], a[2]*2+a[1]+a[n]);
        n-=2;
    }
       //少于4个人直接讨论
    if(n==3)sum+=a[1]+a[2]+a[3];
    else sum+=a[2];//n==2
    printf("%d",sum);
    return 0;
}

原文地址:https://www.cnblogs.com/de-compass/p/11294680.html

时间: 2024-07-31 13:59:39

cqyz oj | 潜水比赛 | 贪心的相关文章

西电oj 1058 图论,贪心

西电oj 1058 图论,贪心 1058: 找子图 时间限制: 1 Sec  内存限制: 128 MB提交: 15  解决: 11[提交][状态][讨论版] 题目描述 现有一张无向图,有n个点m条边,每条边都有一个权值w,现要求从中找出一个子图,这个子图需满足以下特征:1.子图可以为空.2.若某条边的两个端点都在此子图中,则这条边在这个子图中.3.若某条边的两个端点都不在此子图中,则这条边在这个子图外.4.若某条边的两个端点一个在子图中,另一个不在,则这条边消失.5.子图中所有边权值的和减去子图

小米 OJ 编程比赛 03 月常规赛

A.数学等式 数据比较小,可以暴力+折半枚举. #include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=200010; map<int,int>mp; int main() { int N,A,B,C,D,E; ll ans=0; scanf("%d%d%d%d%d",&

light oj 1219 树上贪心

1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <queue> 5 #include <cstdio> 6 #include <algorithm> 7 #include <map> 8 //#include <time.h> 9 //#include <ext/pb_ds/assoc_container

台州 OJ 1555 Chores 贪心+深搜

给 n 个任务,有些任务会有前驱任务,不相关的任务可以同时做,求把这些任务做完的最少时间是多少. 比较水的一道题,任务能尽早开始就尽早开始做(从时间点0开始),如果有前驱任务,就要把前驱任务完成的时间也加上,完成时间最长的任务的时间就是答案 代码: #include <iostream> #include <cstring> #include <vector> using namespace std; const int MAX = 10005; const int I

小米 OJ 编程比赛 12 月常规赛

小米兔跳格子 序号:#119难度:一般时间限制:1000ms内存限制:30M 描述 米兔爸爸为了让小米兔好好锻炼身体,便给小米兔设置了一个挑战——跳格子. 要吃到自己心爱的胡萝卜,小米兔需要跳过面前一些格子.现有 NN 个格子,每个格子内都写上了一个非负数,表示当前最多可以往前跳多少格,胡萝卜就放在最后一个格子上.米兔开始站在第 1 个格子,试判断米兔能不能跳到最后一个格子吃到胡萝卜呢? 输入 输入为 NN 个数字 (N \lt 10N<10),用空格隔开,第 ii 个数字 s_isi? (0

cqyz oj | 【训练题】HB办证 P1419 | DP动态规划

Description HB要办个签证,办证处是一座 M 层的大楼,每层楼都有 N 个办公室,编号为1..N,每个办公室有一个签证员,签证需要让第 M 层的某个签证员盖章才有效.每个签证员都要满足下面三个条件之一才会给HB盖章: 这个签证员在1楼. HB的签证已经给这个签证员的正楼下(房间号相同)的签证员盖过章了. HB的签证已经给这个签证员的相邻房间(房间号相差1,楼层相同)的签证员盖过章了. 每个签证员盖章都要收取一定费用,这个费用不超过1000000000.找出费用最小的盖章路线,使签证生

cqyz oj | 树的分治 | 树形DP | 树的重心

Description 给定一棵N个节点的带权树,定义dist(u,v)为u,v两点间的最短路径长度,路径的长度义为路径上所有边的权和.再给定一个K,如果对于不同的两个结点a,b,如果满足dist(a,b)<=K,则称(a,b)为合法点对. 你的任务是求合法点对个数. Input 第一行包含两个个整数N和K,接下来的N-1行,每行包含三个整数:u,v,len,表示树边(u,v)的长度len. Output 一个整数,表示合法点对的数目. Sample Input 1 5 4 1 2 3 1 3

cqyz oj | 树的相交路径 | 最近公共祖先

Description 给定含 n 个结点.边带权的无根树,请回答下面的询问: 1 a b c d:询问路径a->b是否是路径c->d的子路径. 2 a b c d:询问路径a->b和c->d的最长公共路径长度. Input 第一行包括两个正整数 n,m,表示树的节点数和询问数,树结点从1到n编号. 接下来n-1行描述树边情况,其中第i行包含三个整数 a, b和t,表示第i条双向连接a和b,长度为t. 接下来m行描述询问情况,每一个询问如题目描述格式. Output 每个询问的回答

cqyz oj | 树上的询问 | 最近公共祖先

Description 现有一棵 n 个节点的棵, 树上每条边的长度均为 1. 给出 m 个询问, 每次询问两个节点 x,y, 求树上到 x,y 两个点距离相同的节点数量. Input 第一个整数 n, 表示树有 n 个点. 接下来 n-1 行每行两整数 a, b, 表示从 a 到 b 有一条边. 接下来一行一个整数 m, 表示有 m 个询问. 接下来 m 行每行两整数 x, y, 询问到 x 和 y 距离相同的点的数量. Output 共 m 行, 每行一个整数表示询问的答案. Sample