牛客:纪念品分组

牛客:纪念品分组
链接: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();
   }
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值