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 }