过河问题--nyoj题目47

过河问题

时间限制:1000 ms  |  内存限制:65535 KB

难度:5

描述

在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。

输入
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出
输出所有人都过河需要用的最少时间
样例输入
1
4
1 2 5 10
样例输出
17

这个题要用贪心算法,一个人的时候没话说两个人是时间较长的那个人三个人的时候,先让第一短时间的人带时间最长的过去,时间短的再返回,带第二短的人过去四个人及其以上的时候,有两种方法时间较短      1.第一短的带最长的,再回来带第二短的,依次带完      2.第一短带第二短,第一短回来,把手电给最长和第二长,再让第二短回来      这两种方法只是送过去两个人
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int time[1010];
 6
 7 int main()
 8 {
 9     int n,i,b,N;
10     scanf("%d",&N);
11     while(N--)
12     {
13         scanf("%d",&n);
14         for(i=0;i<n;i++)
15         {
16             scanf("%d",&time[i]);
17         }
18         sort(time,time+n);
19         int sum=0;
20         while(n>3)
21         {
22             if(2*time[1]+time[0]>2*time[0]+time[n-2])
23                 sum+=2*time[0]+time[n-2]+time[n-1];
24             else
25                 sum+=2*time[1]+time[0]+time[n-1];
26                 n-=2;
27         }
28         if(n==3)
29         sum+=time[1]+time[0]+time[2];
30         if(n==2)
31         sum+=time[1];
32         if(n==1) sum += time[0];
33         printf("%d\n",sum);
34     }
35     return 0;
36 }

时间: 2024-12-05 00:50:30

过河问题--nyoj题目47的相关文章

NYOJ-47过河问题

这是一道经典的贪心算法的题目.首先说一下我对这道题的理解: n个人要过河,已知每个人的过河时间且过河时必须要使用唯一的手电筒.桥只能允许最多 两个人同时过河.让求所有人都过河后的最短时间. 我们不难知道:必须同时两个人过河,因为要把手电筒送回来,让为过河的人过河.使用贪 心的思想解决这个问题,首先要对这n个人的过河时间排序并保存在数组S中.这也是大多数贪心 解决问题的共同点. 根据贪心原则,我们有两个贪心策略: 策略A: 让最快的两个人去送最慢的两个人.首先S[0]和S[1]过河,S[0]把手电

NYOJ题目889求距离

------------------------------------------ 题目可以抽象一下为计算坐标系上两点间的距离,即 AC代码: 1 import java.awt.Point; 2 import java.io.BufferedReader; 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 6 public class Main { 7 8 public static void main(S

NYOJ题目845无主之地1

----------------------------------------- 这道题有坑,就是打印的顺序必须是和输入的顺序一致,这就是他所谓的不排序的意思,瞬间将复杂度提高出题人真是“好水平”.... AC代码: 1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Scanner; 4 5 public class Main { 6 7 public static void main(Strin

NYOJ题目111分数加减法

------------------------------------------- 需要注意的就是考虑各种情况,各种!各种!!各种!!!各种情况,真是一个让人崩溃但是炒鸡修身养性的题啊....:) AC代码: 1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 5 public class Main { 6 7 public static vo

NYOJ题目840吃花生

---------------------------------------------- 这道题有坑,如果直接使用题描述中给出的单词比较是不相等的,猜测可能使用了缩写,不过只使用前两个字符就可以区分,所以如下: AC代码: 1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 8 Scanner

NYOJ题目57 6174问题

----------------------------------------------------- 感觉这个OJ题目难度划分很不合理,这道理明明很简单却给了2的难度,而之前难度为0的水题有好多难死个人没做出来让我暗暗觉得自己脑子里都是屎... 把题目描述翻译成人话的意思就是多少次以后这个序列会出现,想明白这一点就比较简单了. AC代码: 1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main

NYOJ题目1049自增自减

--------------------------------- 简单的字符判断. AC代码: 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 Scanner sc=new Scanner(System.in); 8 9 int times=Integer.parseInt(sc.nextLine()); 10 while(times-->0

NYOJ题目10505C?5S?

--------------------------------------- 水. AC代码: 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 Scanner sc=new Scanner(System.in); 8 9 int times=sc.nextInt(); 10 while(times-->0){ 11 double a=sc.n

NYOJ 题目56 阶乘式因式分解(一)

题目描述: 给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m. 输入 第一行是一个整数s(0<s<=100),表示测试数据的组数随后的s行, 每行有两个整数n,m. 输出 输出m的个数. 样例输入 2 100 5 16 2 样例输出 24 15我的代码://AC #include<stdio.h>int main(){ int s,k; scanf("%d",&s); while(s--)