公司组织团建活动,到某漂流圣地漂流,现有如下情况:
员工各自体重不一,第 i 个人的体重为 people[i],每艘漂流船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
为节省开支,麻烦帮忙计算出载到每一个人所需的最小船只数(保证每个人都能被船载)。
思路分析:
这道题利用好最多可同时载两人这个条件,然后把数组排序后(复杂度为O(nlogn)),再利用贪心算法,把最重的人+前面最适合的一个人,即这两个人加起来最接近limit重量放到一条船上,若最重的人和任意一个人组合都大于limit,则最重的人自己一条船,这里找那个人时可以用变种二分查找,能降低复杂度(此处没用变种二分查找,因为代码会变得比较复杂)。然后当选出了那两个人后,就从数组中删除,因为数组删除元素操作比较耗费性能,因此博主把这操作变为把数组里的元素置为-1。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String p[] = s.split(" ");
int[] people = new int[p.length];
for(int i=0;i<p.length;i++){
people[i]=Integer.parseInt(p[i]);
}
int