题目描述:
在一场比赛中,共有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()。