南阳47 过河问题(经典贪心)

来源:互联网 发布:顺德农商网上银行软件 编辑:程序博客网 时间:2024/06/06 09:15

过河问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:5
描述

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

输入
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出
输出所有人都过河需要用的最少时间
样例输入
141 2 5 10
样例输出
17
算法思想:从大到小依次往过送,每次送最大的两个,方案有两种
第一:AB过,A回,CD过,B回;t1=a[0]+a[1]*2+a[n];
第二:AD过,A回,AC过,A回;t2=2*a[0]+a[n-1]+a[n];
当剩余3个人的时候 AC过,A回,AB过这种情况消耗时间最短。t3=a[0]+a[1]+a[2];
剩余2个或1个人时,可以直接全部过去。 t4=a[1](2个人)或t4=a[0](1个人)
推荐:参考链接
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include<stdio.h>   
  2. #include<string.h>   
  3. #include<algorithm>   
  4. using std::sort;  
  5. int min(int a,int b){return a<b?a:b;}  
  6. int Bridge_corss(int n,int *a)  
  7. {  
  8.   
  9.    int t=0;  
  10.    for(n--;n>=3;n-=2)  
  11.      { //从大到小依次送过去即可    
  12.        int t1=a[0]+a[1]*2+a[n];  
  13.        //AB过,A回,t=a[1]+a[0];   
  14.        //CD过,B回,t=a[n]+a[1];   
  15.        //AB不过 ,t=a[1];   
  16.        int t2=2*a[0]+a[n-1]+a[n];  
  17.        //AD过A回,AC过A回    
  18.        t+=min(t1,t2);   
  19.      }  
  20.      if(n==2)  
  21.         t+=a[0]+a[1]+a[2];  
  22.         //AC过,A回,AB再过则全部过去   
  23.     else if(n==1)  
  24.          t+=a[1];  
  25.     else if(n==0)  
  26.            t+=a[0];  
  27.     return t;  
  28. }   
  29. int main()  
  30. {  
  31.     int N;  
  32.     int a[1200];  
  33.     scanf("%d",&N);  
  34.     while(N--)  
  35.     {  
  36.         int n;  
  37.         memset(a,0,sizeof(a));  
  38.       scanf("%d",&n);  
  39.       for(int i=0;i<n;i++)  
  40.         scanf("%d",&a[i]);  
  41.         sort(a,a+n);  
  42.         printf("%d\n",Bridge_corss(n,a));   
  43.     }  
  44. return 0;  
  45. }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度两周岁宝宝口吃怎么办 2岁宝宝偶尔结巴怎么办 两岁宝宝说话磕巴怎么办 宝宝两岁结巴了怎么办 人多说话就紧张怎么办 小孩拉尿不叫人怎么办 2岁宝宝说话有点结巴怎么办 两岁半的宝宝说话结巴怎么办 2个月宝宝怕洗澡怎么办 2岁宝宝不喜欢喝奶粉怎么办 宝宝断奶不喜欢喝奶粉怎么办 宝宝不喜欢奶粉的味道怎么办 四个月宝宝不喜欢吃奶粉怎么办 四岁宝宝有口臭怎么办 4个月宝宝口臭怎么办 2岁宝宝有口臭是怎么办 两岁宝宝有口气怎么办 2岁宝宝口气重是什么原因怎么办 两岁宝宝口气重怎么办 两岁宝宝有口臭怎么办 两岁身高不达标怎么办 两岁宝宝82厘米怎么办 2岁幼儿说话结巴怎么办 2岁的宝宝结巴怎么办 2岁半宝宝口吃怎么办 2周岁宝宝不说话怎么办 三周岁宝宝不说话怎么办 2周岁宝宝突然说话结巴怎么办 两周岁宝宝突然说话结巴怎么办 三周岁宝宝说话突然结巴怎么办 小孩g和d不分怎么办 两岁宝宝皮肤黑怎么办 2岁宝宝肤色偏黄怎么办 2岁宝宝迷上手机怎么办 2岁宝宝说话口吃怎么办 两岁宝宝突然口吃怎么办 两岁半的宝宝还不会说话怎么办 2岁宝宝自闭症怎么办呀 新生儿又吐又拉怎么办 一岁多宝宝受凉呕吐拉稀怎么办 7个月的宝宝腹泻怎么办