牛客:纪念品分组
链接:https://ac.nowcoder.com/acm/problem/16640
法一:
我自己写的很low。
思路:本想二分,但是处理完还要排序,看数据暴力不可,再看W紧紧在200以内,那么我们吧p也在200内 ,可以用下表统计,计算出每个数出现的次数,第i个数在一组,因为一个组只能两个数,所以再找一个数字和这个数匹配,被找的第二个数应该满足 小于等于 w-x[i] ; 枚举w-x[i]之内的数字
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int w,n;
int[] x = new int[30005];
int[] cnt = new int[500];
for(int i=0;i<499;i++) {
cnt[i]=0;
}
w=sc.nextInt();
n=sc.nextInt();
for(int i=0;i<n;i++) {
x[i]=sc.nextInt();
cnt[x[i]]++;
}
int ans = 0;
for(int i = 0; i < n ; i++) {
if(cnt[x[i]]==0) {
continue;
}
cnt[x[i]]--;
for(int j = w-x[i] ; j>=5 ; j--) {
if(cnt[j] >= 1) {
cnt[j]--;
break;
}
}
ans++;
}
System.out.println(ans);
sc.close();
}
}
法二:
首先对数组排序,设置两个指针 i ,j 分别指向数组的头尾
如果x[i]+x[j]<=w i++,j-- 否则j-- ,因为最小的数和j都不能分在一个组,那么再大一点的数字肯定也不行;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int w,n;
int[] x = new int[30005];
int[] cnt = new int[500];
for(int i=0;i<499;i++) {
cnt[i]=0;
}
w=sc.nextInt();
n=sc.nextInt();
for(int i=0;i<n;i++) {
x[i]=sc.nextInt();
}
Arrays.sort(x,0,n);
int i=0,j=n-1,ans=0;
while(i<=j) {
if(x[i]+x[j]<=w) {
i++;j--;ans++;
}else {
j--;ans++;
}
}
System.out.println(ans);
sc.close();
}
}