7.22拼多多java第三题讨论
我有一种思路,先对货物排序然后给出最左和最右两个下标i和j。
1)首先找到左边起和下标j货物的总重量最接近300的那个数,把i移到那个货物上,然后再将i和j往中间移。
2)移动的时候保证i<j且j货物重量>150。
3)最后从左到右遍历一遍。
不知道这种做法还有没有漏掉的情况,请大佬指教。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
String[] str= s.split(" ");
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<str.length;i++){
list.add(Integer.valueOf(str[i]));
}
Collections.sort(list);
int i=0;
int j=list.size()-1;
int num=0;
if (list.get(i)+list.get(j) < 300) {
while (list.get(i)+list.get(j)<=300 && i<j) {
i++;
}
i--;
}
while (i>=1 && list.get(i)==list.get(i-1)) {
i--;
}
while(i<j && list.get(j)>150){
if(list.get(i)+list.get(j) > 300){
num++;
list.set(j, -1);
j--;
} else {
num++;
list.set(i, -1);
list.set(j, -1);
j--;
i++;
}
}
int sum = 0;
for (i=0; i<=j; i++) {
if (list.get(i) > 0) {
sum += list.get(i);
if (sum == 300) {
num++;
sum = 0;
}
if (sum > 300) {
num++;
sum = 0;
i--;
}
}
}
if (sum != 0) num++;
System.out.println(num);
}
#笔试题目##拼多多#