nyoj 过河问题 贪心
来源:互联网 发布:程序员写代码的软件 编辑:程序博客网 时间:2024/05/01 05:47
#include<stdio.h>#include<stdlib.h>int a[1005];int cmp(const void *a,const void *b){return *(int *)a-*(int *)b;}int main(){ int m, n, i; scanf("%d",&m); while(m--) { scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } qsort(a,n,sizeof(a[0]),cmp); int sum=0; while(n>=4) { if((a[1]*2+a[n-1]+a[0])>(2*a[0]+a[n-1]+a[n-2])) { sum += a[n-1]; //用时最短的和用时最长的一起过去 sum += a[0]; //用时最短的回来 sum += a[n-2]; //用时最短的和用时第二长的一起过去 sum += a[0]; //用时最短的回来 } else { sum += a[1]; //最短的和第二短的一起过去 sum += a[0]; //最短的回来 sum += a[n-1]; //最长的和第二长的一起过去 sum += a[1]; //第二短的回来 } n -= 2; } if(n == 3) sum += a[1] + a[0] + a[2]; else if(n == 2) sum += a[1]; else sum += a[0]; printf("%d\n",sum); } return 0;}
如果n==1或者n==2,所有人直接过河即可;
如果n==3,用时最短的和用时最长的一起过去,然后用时最短的回来,再和剩下的一个人过去 ;
如果n>=4,设a[0]表示用时最短的人所用的时间,a[1]为用时第二短的人所用的时间,a[n-1]表示用时最长的人所用的时间,a[n-2]表示用时第二长的人所用的时间。那么:
当2a[1] + a[0] + a[n-1] > 2a[0] + a[n-1] + a[n-2]时,就先让用时最短的人和用时最长的人一起过去,然后用时最短的回来,接着让用时最短的和用时第二长的一起过去,再让用时最短的回来。
否则,就先让用时最短的和用时第二短的一起过去,然后用时最短的回来,接着让用时最长和用时第二长的一起过去,再让用时第二短的回来。这样就相当于剩下了n-2个人。对这n-2个人执行相同的操作,知道剩下不足4个人即可
部分知识借鉴于:http://blog.csdn.net/lyhvoyage/article/details/23196933
0 0
- 过河问题 NYOJ 贪心
- 贪心-nyoj-过河问题
- nyoj 过河问题 贪心
- nyoj 47 过河 过河问题 【贪心】
- NYOJ 47 过河问题 (贪心)
- NYOJ 47 过河问题 (贪心)
- nyoj 47 过河问题 【贪心】
- nyoj 47 过河问题 贪心
- NYOJ 47-过河问题(贪心)
- NYOJ-47 过河问题(贪心)
- NYOJ 47 过河问题 (贪心)
- NYOJ 题目47 过河问题 (贪心)
- POJ-1700 &&NYOJ 47 过河问题【贪心】
- nyoj 47 过河问题(贪心)
- Num 30 : NYOJ : 0047 过河问题 [ 贪心 ]
- nyoj 47 过河问题(贪心)
- NYOJ 47 过河问题(贪心)
- 贪心问题--过河问题
- 第一次
- 2.堆和栈
- HBase总结(8)--附加过滤器、FilterList
- vim编辑器基本使用命令
- bzoj 1691(treap)
- nyoj 过河问题 贪心
- 同一进程中的线程究竟共享哪些资源
- Java.作业2 myClass
- 使用AngularJS实现一个简单页面
- listview怎么通过点击显示、隐藏
- 使用Reachability网络监测
- C#中的lock关键字(初识)
- 从一个问题来认识android:configChanges属性
- 如何挑选适合的前端框架?