问题描述
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时 间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入格式
输入包含n+2行:
第1行包括一个整数w,为每组纪念品价格之和的上限。
第2行为一个整数n,表示购来的纪念品的总件数。
第3~n+2行每行包含一个正整数pi (5 <= pi <= w),表示所对应纪念品的价格。
输出格式
输出仅一行,包含一个整数,即最少的分组数目。
样例输入
100
9
90
20
20
30
50
60
70
80
90
样例输出
解题思路:
1.将数组从大到小排序
2.从数组最后一个元素向数组第一个元素开始匹配,如果最后一个元素加第一个元素超过最大价格,则i向前移动 j不变。
3.如果最后一个元素加第一个元素没有超过最大价格,则i--,j++如果j大于等于i,则匹配结束
package asf;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String [] args) {
Scanner scanner =new Scanner(System.in);
int moneyH=scanner.nextInt();//价格上限
int productNumber=scanner.nextInt();//购买商品数量
int price[]=new int [productNumber];
for(int i=0;i<productNumber;i++) {
price[i]=scanner.nextInt();
}
//将数组从小到大排序
Arrays.sort(price);
int count=0;//记录分组数
int j=0;
//思路是:从数组最后一个元素向数组第一个元素开始匹配,如果最后一个元素加第一个元素超过最大价格
//则i向前移动 j不变
//如果最后一个元素加第一个元素没有超过最大价格,则i--,j++
//如果j大于等于i,则匹配结束
for(int i=price.length-1;i>=0;i--) {
if(price[i]+price[j]>moneyH) {
count++;
}
else {
count++;
j++;
}
if(j>=i)
break;
}
System.out.print(count);
}
}