NYOJ 47过河问题
2014-08-31 12:08
204 查看
主要思路:先排序。有两种可能是最小的情况,一种是让最小的去带着最大的过去,然后最小的再回来,还有一种就是先最小的和第二小的一块过去, 然后最小的回来,让最大的和第二大的过去,接着第二小的回来,第二小和最小的接着在过去,最小的接着回来,主要就是这两种,用的时候判断一下,接着的问题就是n是奇数还是偶数的问题
排完序之后的a[0]最小, a[n-1]最大,第一种的时间为a[0] + a[n -1] + a[0] + a[n - 2];其中a[0]是最短的时间,a[n-1]是最大的时间,下面一样, 第二种的时间为a[n -1] + a[1] + a[1] + a[0];其中a[1]是第二小的时间。最后要判断是奇偶数,具体代码如下,代码上有注释:
排完序之后的a[0]最小, a[n-1]最大,第一种的时间为a[0] + a[n -1] + a[0] + a[n - 2];其中a[0]是最短的时间,a[n-1]是最大的时间,下面一样, 第二种的时间为a[n -1] + a[1] + a[1] + a[0];其中a[1]是第二小的时间。最后要判断是奇偶数,具体代码如下,代码上有注释:
#include <stdio.h> #include <stdlib.h> int main() { int t, i, j, tmp, sum, index; scanf("%d", &t); while(t --) { int n, a[1001]; scanf("%d", &n); for(i = 0; i < n; i ++) { scanf("%d", &a[i]); } for(i = 0; i < n - 1; i ++)//选择排序 { index = i; for(j = i + 1; j < n; j ++) if(a[index] > a[j]) index = j; tmp = a[index]; a[index] = a[i]; a[i] = tmp; } if(n <= 2)//如果n为1或者为2 的时候,只需要进行一次过桥,时间为最后一个人的 { printf("%d\n", a[n - 1]); continue; } sum = a[1]; while(n > 3)//当n > 3的时候过桥时间有个规律,最短一共两种,一种是最短时间的那个人带着最长的那个过,然后自己再回来,还有就是先最长的两个过去,第二短的回来,第一第二短在过去,第一短再回来 { if(a[0] + a[n - 1] + a[0] + a[n - 2] > a[n - 1] + a[1] + a[1] + a[0])//这里判断当用最小的运过去与普通方法运过去的大小 sum += a[n - 1] + a[1] + a[1] + a[0]; else sum += a[0] + a[n - 1] + a[0] + a[n - 2]; n -= 2;//将n减少2,因为一次过去两个 } if(n == 3)//这里判断有两个用途,一个实判断是否是奇数,就是最后还剩三个,还有就是刚开始是奇数的时候 sum += a[2] + a[0]; printf("%d\n", sum); } return 0; }
相关文章推荐
- NYOJ47过河问题
- NYOJ-47过河问题
- NYOJ47 过河问题
- NYOJ 47 过河问题 (贪心)
- nyoj 47 过河问题
- NYOJ_47 过河问题,贪心选择
- NYOJ47过河问题
- nyoj47过河问题(贪心)
- NYOJ-47-过河问题-2013年08月15日16:17:01
- NYOJ 47 过河问题
- nyoj-47-过河问题&&poj-1700-Crossing River
- NYOJ 题目47 过河问题 (贪心)
- NYOJ47过河问题
- NYOJ 47 过河问题
- NYOJ47——过河问题(贪心)
- NYOJ-47 过河问题 http://acm.nyist.net/JudgeOnline/problem.php?pid=47
- 过河问题nyoj47
- nyoj47过河问题(贪心)
- nyoj-47-过河问题
- NYOJ-47 过河问题(贪心)