历届试题 对局匹配 DP java

本文探讨了一个围棋网站的自动对局系统如何匹配积分差为特定值K的玩家进行对弈。通过对用户积分分布的分析,采用动态规划算法解决在特定条件下,系统无法匹配任何对局的最大在线用户数量问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

  小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。


  小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。


  现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, ... AN。


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

输入格式

  第一行包含两个个整数N和K。
  第二行包含N个整数A1, A2, ... AN。


  对于30%的数据,1 <= N <= 10
  对于100%的数据,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000

输出格式

  一个整数,代表答案。

样例输入

10 0
1 4 2 8 5 7 1 4 2 8

样例输出

6

 

简单DP,因为只有等差为K的数列才有影响,所以对K个数列单独求最大人数,最后求和即可。

DP[i][0]代表从0到i,i位置不选时满足题意的最多人数

DP[i][1]代表从0到i,i位置选择时满足题意的最多人数

dp[j][0] = Math.max(dp[j-k][0] , dp[j-k][1]);
dp[j][1] = Math.max(dp[j-k][0] + s[j], dp[j-k][1]);

k为0时就是求不同数字有多少个

 

O(n)还是有一组一直T,可能没开JAVA 2倍时限

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.Vector;

 
public class Main {
	  public static void main(String args[]) {
		  Scanner scan = new Scanner(System.in);
		  int maxn = 100000+10;
		  int s[] = new int[maxn];
		  int n = scan.nextInt();
		  int k = scan.nextInt();
		  for(int i = 0 ; i < n ; i++) {
			  int temp = scan.nextInt();
			  s[temp]++;
		  }
		  
		  if(k == 0) {
			  int sum = 0;
			  for(int i = 0 ; i < maxn ; i++) {
				  if(s[i] != 0) {
					  sum++;
				  }
			  }
			  System.out.println(sum);
		  }else {
			  int sum = 0;
			  int dp[][] = new int[maxn][3];
			  for(int i = 0 ; i < k ; i++) {
				  
				  dp[i][0] = 0;
				  dp[i][1] = s[i];
				  int Max = 0;
				  for(int j = i + k; j < maxn ; j += k) {
					  dp[j][0] = Math.max(dp[j-k][0] , dp[j-k][1]);
					  dp[j][1] = Math.max(dp[j-k][0] + s[j], dp[j-k][1]);
					  Max = Math.max(dp[j][0], dp[j][1]);
				  }
				  sum += Max;
			  }
			  System.out.println(sum);
		  }
	  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值