Java蓝桥杯——比赛对局匹配


题目描述:

在一场比赛中,共有N名用户,他们的积分分别是A1, A2, ... AN。

系统在匹配比赛时,只会将积分差恰好是K的用户配在一起。

请问,最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)?



代码:

已知:

比赛总用户数量K

他们各自的比赛积分A1、A2、A3......

系统匹配对手的积分差K

输入:

第一行 N K

第二行 N个整数(N个人分别的积分)

package easy;

import java.util.Arrays;
import java.util.Scanner;

public class Number_n {
	static int max_count = 100010;
	public static void main(String[] args) {
		
		Scanner input = new Scanner(System.in);
		int N = input.nextInt();	//用户总人数
		int K = input.nextInt();	//固定的积分差值
		
		int[] dp = new int[max_count+1];		//dp[i]表示,在当前分组中,前i个人里面,最多满足要求的人数
		int[] count = new int[max_count+1];		//count[i]表示,分数为i的人数
		int[] value = new int[max_count+1];		//value[i]表示,在当前分组中,按顺序排的数字,第i个数字出现的次数
		int[] score = new int[N];

		int result1 = 0;
		int result2 = 0;
		
		for(int i = 0;i < N;i++){
			score[i] = input.nextInt();
			count[score[i]]++;
		}
		
		for(int number = 0;number < max_count;number++){
			if(count[number]!=0)
				result1++;
		}
		
		if(K==0){
			System.out.println(result1);
		}
		else{
			for(int i = 0;i < K;i++){		//分成k组
				int m = 0;
				for(int j = i;j <= max_count;j=j+K)
					value[m++] = count[j];
				dp[0] = value[0];
				for(int p = 1;p < m;p++){		//循环结束时p==m
					if(p==1)
						dp[1] = Math.max(value[0], value[1]);
					else
						dp[p] = Math.max(dp[p-1], dp[p-2]+value[p]);
				}
				
				result2 = result2+dp[m-1];
			}
			System.out.println(result2);
		}
		
		input.close();
	}

}
 



解题思路:

提示:这里填写问题的分析:
例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()和 Handler.sendMessage(),其中 obtainMessage 方式当数据量过大时,由于 MessageQuene 大小也有限,所以当 message 处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。



解决方案:

提示:这里填写该问题的具体解决方案:
例如:新建一个 Message 对象,并将读取到的数据存入 Message,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();换成 mHandler.sendMessage()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值