独木舟问题

n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?

输入

第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。
接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。
输出
 
一行一个整数表示最少需要的独木舟数。
 
输入示例

3 6
1
2
3

输出示例

2

 贪心思想:就是判断最重的那个人能不能和最轻的那个人同一条船,如果不能,则最重的人一定是一个人一条船

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 ll a[10005];
 7 int main(){
 8     ll n, m;
 9     cin>>n>>m;
10     for(int i=0; i<n; i++){
11         cin>>a[i];
12     }
13     sort(a, a+n);
14     ll k=0;
15     for(int i=n-1; i>=0; i--){
16         int s=0;
17         if(a[i]==0){
18             break;      //如果搜到了a[i]=0的点,说明分配完毕,结束循环
19         }
20         while(a[s]==0){
21             s++;
22         }
23         if((a[s]+a[i])>m){  //具体实现细节,从最重的人开始枚举,如果最轻的人能和最重的人坐一条船,就把最轻的人弄出去,设a[i]=0
24             a[i]=0;
25             k++;
26         }else{
27             a[i]=a[s]=0;
28             k++;
29         }
30     }
31     cout << k << endl;
32     return 0;
33 }
原文地址:https://www.cnblogs.com/ledoc/p/6559747.html