乘船问题【经典贪心】

题目链接:http://www.bjfuacm.com/contest/115/problem/565/

                                                        乘船问题

                                            发布时间: 2018年4月24日 15:21   时间限制: 1000ms   内存限制: 128M

有n个人,第i个人重量为w[i]。每艘船的最大载重量均为C,且最多只能乘两个人。请问如何用最少的船装载所有人。

输入有多组数据。每组数据第一行输入两个整数n和C,表示有n个人,每艘船最大载重量为C,第二行输入n个整数w[i],表示每个人的重量。所有数据均在[1, 1000]内,对于所有的w[i],都有w[i] <= C。

对应每组数据,输出一个整数,表示装载所有人用的最少船数。

3 100
50
90
40
2

解题思路:
将所有人的重量按照从小到大的顺序排列,如果当前重量最小的人加上重量最大的人仍然<=船的总承受量的话,就让他俩乘坐一条船,毫无疑问,这样浪费船的空间是最少的,所以可知,这样分配是最优的。
如果当前
重量最小的人加上重量最大的人>=船的承受量的话,那就只能让当前重量最大的让人单独坐一条船。
 
  
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int i, n, w[1010], c;
    while (scanf("%d%d", &n, &c) != EOF)
    {
        for (i = 0; i<n; i++)
            scanf("%d", &w[i]);
        sort(w, w + n);
        int sum = 0;
        i = 0;
        while (i<n)
        {
            if (w[i] + w[n - 1] <= c)          //如果重量最大的和最小的能够坐一条船,那么就让他们坐一条船,然后继续在剩下的人中重复这些操作
            {
                i++;
                n--;
                sum++;
            }
            else                               //如果当前重量最小的加上最大的都会超过c的话,那么就只能让重量最大的单独坐一条船 
            {
                n--;
                sum++;
            }
        }
        printf("%d\n", sum);
    }
    return 0;
}
 
  
2018-04-25

猜你喜欢

转载自www.cnblogs.com/00isok/p/8946780.html