首页 > 代码库 > nyoj-47-过河问题|POJ-1700-Crossing River
nyoj-47-过河问题|POJ-1700-Crossing River
http://acm.nyist.net/JudgeOnline/problem.php?pid=47
http://poj.org/problem?id=1700
解题思路:求最少需要多少时间才能都通过。先将每个人过河所需的时间升序排序
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int a[1010];
6 int n, t, i;
7 int ans;
8
9 int cmp(const void *a, const void *b){
10 return *(int *)a - *(int *)b;
11 }
12
13 void solve(){
14 ans = 0;
15 while(n){
16 if(n == 1){
17 ans += a[1];
18 break;
19 }
20 else if(n == 2){
21 ans += a[2];
22 break;
23 }
24 else if(n == 3){
25 ans += a[1] + a[2] + a[3];
26 break;
27 }
28 else{
29 //人较多的情况下,判断是先把走得最慢的两个人送过去合算还是先把走得最快和最慢的人先送过去
30 if(2 * a[2] > a[1] + a[n - 1]){
31 ans += (a[n - 1] + a[n] + 2 * a[1]);
32 }
33 else{
34 ans += (a[1] + 2 * a[2] + a[n]);
35 }
36 n -= 2;
37 }
38 }
39 printf("%d\n", ans);
40 }
41
42 int main(){
43 scanf("%d", &t);
44 while(t--){
45 scanf("%d" ,&n);
46 for(i = 1; i <= n; i++){
47 scanf("%d", &a[i]);
48 }
49 qsort(a + 1, n, sizeof(a[1]), cmp);
50 solve();
51 }
52 return 0;
2 #include <stdlib.h>
3 #include <string.h>
4
5 int a[1010];
6 int n, t, i;
7 int ans;
8
9 int cmp(const void *a, const void *b){
10 return *(int *)a - *(int *)b;
11 }
12
13 void solve(){
14 ans = 0;
15 while(n){
16 if(n == 1){
17 ans += a[1];
18 break;
19 }
20 else if(n == 2){
21 ans += a[2];
22 break;
23 }
24 else if(n == 3){
25 ans += a[1] + a[2] + a[3];
26 break;
27 }
28 else{
29 //人较多的情况下,判断是先把走得最慢的两个人送过去合算还是先把走得最快和最慢的人先送过去
30 if(2 * a[2] > a[1] + a[n - 1]){
31 ans += (a[n - 1] + a[n] + 2 * a[1]);
32 }
33 else{
34 ans += (a[1] + 2 * a[2] + a[n]);
35 }
36 n -= 2;
37 }
38 }
39 printf("%d\n", ans);
40 }
41
42 int main(){
43 scanf("%d", &t);
44 while(t--){
45 scanf("%d" ,&n);
46 for(i = 1; i <= n; i++){
47 scanf("%d", &a[i]);
48 }
49 qsort(a + 1, n, sizeof(a[1]), cmp);
50 solve();
51 }
52 return 0;
53 }
nyoj-47-过河问题|POJ-1700-Crossing River
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。