nyoj 71-独木舟上的旅行(贪心)

71-独木舟上的旅行

      内存限制:64MB 时间限制:3000ms 特判: No 

 

      通过数:10 提交数:15 难度:2 

 

题目描述:

进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅客的最少的独木舟条数。现在请写一个程序,读入独木舟的最大承载量、旅客数目和每位旅客的重量。根据给出的规则,计算要安置所有旅客必须的最少的独木舟条数,并输出结果。

输入描述:

第一行输入s,表示测试数据的组数;
每组数据的第一行包括两个整数w,n,80<=w<=200,1<=n<=300,w为一条独木舟的最大承载量,n为人数;
接下来的一组数据为每个人的重量(不能大于船的承载量);

输出描述:

每组人数所需要的最少独木舟的条数。

样例输入:

3
85 6
5 84 85 80 84 83
90 3
90 45 60
100 5
50 50 90 40 60

样例输出:

5
3
3

分析:
  1、排完序后,从两边开始向中间贪心;
  2、两端之和小于总重,两端共同向中心靠近一步,否则就是大的那点向中心靠近
  PS:输入、输出要注意数据类型

核心代码:
 1 while(i <= j)
 2 {
 3     if(A[i] + A[j] <= max_weight)
 4     {
 5         ++ i, -- j;
 6         ++ cnt;
 7     }
 8     else
 9     {
10         ++ i;
11         ++ cnt;
12     }
13 }

C/C++代码实现(AC):

 

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <stack>
 7 #include <map>
 8 #include <queue>
 9 #include <set>
10 
11 using namespace std;
12 const int MAXN = 310;
13 int A[MAXN];
14 
15 int main()
16 {
17     int t;
18     scanf("%d", &t);
19     while(t --)
20     {
21         int max_weight, n, cnt = 0, i = 0, j;
22         scanf("%d%d", &max_weight, &n);
23         for(int i = 0; i < n; ++ i)
24             scanf("%d", &A[i]);
25         sort(A, A+n,greater<int>());
26         j = n-1;
27 
28         while(i <= j)
29         {
30             if(A[i] + A[j] <= max_weight)
31             {
32                 ++ i, -- j;
33                 ++ cnt;
34             }
35             else
36             {
37                 ++ i;
38                 ++ cnt;
39             }
40         }
41         printf("%d\n", cnt);
42     }
43     return 0;
44 }

 

 

 

posted @ 2018-05-30 16:26  GetcharZp  阅读(280)  评论(0编辑  收藏  举报