题目链接: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