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

小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是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
关键在于,将这样一个对局匹配的题分解为若干个数组(list),每个list中的元素间隔为k或k的倍数,即有可能会出现匹配成功的情况。
对于每一个数组中,即为清晰的0/1背包问题,
可得到递归递推式:
int result =
Max{
___ dp(arrayList, arr, n - 1, k)
___ dp(arrayList, arr, n - 2, k) + arr[arrayList.get(n)]
}
而在每一次的判断时,需要注意考虑每两个元素是否间隔为k,若间隔超过k(即k的倍数),说明当前元素n一定可以被取到(n-1的元素不会影响到元素n)。

注意判断k=0的特殊情况。

以下代码我用的memo来存储每一次的递归结果,避免重复运算,即自顶向下的动态规划。但是最终结果中,有一个测试集有运行错误,看了很久也没有看到错误原因,welcome 广大网友批评指正。

package dp;import java.util.ArrayList;
import java.util.Scanner;public class Duijupipei {public static int memo[];public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();int k = input.nextInt();int arr[] = new int[100001];int min = 100000;int max = 0;for (int i = 0; i < n; i++) {int number = input.nextInt();arr[number]++;if (number < min)min = number;if (number > max)max = number;}int result = 0;if (k == 0) {for (int i = 0; i < arr.length; i++) {if (arr[i] > 1)result += arr[i] - 1;}System.out.println(n - result);} else {for (int j = 0; j < k; j++) {ArrayList<Integer> arrayList = new ArrayList<>();for (int i = min + j; i <= max; i += k) {if (arr[i] != 0)arrayList.add(i);}int size = arrayList.size();memo = new int[size];result += dp(arrayList, arr, size - 1, k);}System.out.println(result);}}public static int dp(ArrayList<Integer> arrayList, int arr[], int n, int k) {if (n < 0)return 0;if (n == 0)return arr[arrayList.get(n)];if (memo[n] != 0) {return memo[n];}else {if(arrayList.get(n) - arrayList.get(n - 1) > k)return dp(arrayList, arr, n - 1, k) + arr[arrayList.get(n)];else {int result = Math.max(dp(arrayList, arr, n - 1, k), dp(arrayList, arr, n - 2, k) + arr[arrayList.get(n)]);memo[n] = result;return result;}}}}

蓝桥杯第四日——对局匹配相关推荐

  1. 蓝桥杯国赛 对局匹配(DP)

    蓝桥杯国赛 对局匹配(DP) 题目描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是 K ...

  2. 蓝桥杯 历届试题 对局匹配

    问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起.如果两人分差 ...

  3. 蓝桥杯2017第八届——对局匹配

    题目描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起.如果两人分差 ...

  4. 【蓝桥杯】历届试题 对局匹配(C++)

    [蓝桥杯]历届试题 对局匹配(C++) 问题描述 解题思路 具体代码 问题描述 题目链接:对局匹配. 资源限制: 时间限制:1.0s 内存限制:256.0MB 问题描述: 小明喜欢在一个围棋网站上找别 ...

  5. 2017蓝桥杯 对局匹配(贪心)

    历届试题 对局匹配 时间限制:1.0s 内存限制:256.0MB 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在 ...

  6. [蓝桥杯][历届试题 PREV-50]对局匹配(Java)(动态规划)

    历届试题 对局匹配 时间限制:1.0s   内存限制:256.0MB 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系 ...

  7. 【蓝桥杯】历届试题 对局匹配(贪心)

    历届试题 对局匹配 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配 ...

  8. 蓝桥杯 java 历届试题 对局匹配

    历届试题 对局匹配 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动 ...

  9. 第八届蓝桥杯全国总决赛真题解析

    36进制 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 对于 16 进制,我们使用字母 A−F 来表示 10 及以上的数字. 如法炮制,一直用到字母 Z,就可以表示 36 ...

最新文章

  1. 经过五年测试 维基利用HTML5迈入视频时代
  2. Java取模函数,再不刷题就晚了!
  3. Python的嵌套函数使用和闭包
  4. Python画散点图(Knn中数据)
  5. 如何轻松学习Python数据分析?
  6. 在Linux中su和sudo区别,Linux中su和sudo的用法和区别
  7. 两种极端情况的案例:N+1次查询和笛卡尔积
  8. 常见linux服务器系统异常问题
  9. python单词字典排序_python字典排序
  10. Unity3D基础26:物体实例化
  11. thinkphp5 php代码中如何确定文件的路径位置
  12. 计算机组装与维护评课稿,计算机病毒评课稿
  13. 学习笔记 css border-radius
  14. 看过1000份算法简历,才明白人工智能、机器学习、深度学习!!!
  15. 【微信小程序】圆环进度条
  16. Windows命令行下常用网络命令解释大全
  17. 微信小程序多个倒计时
  18. python循环遍历-for循环
  19. 常用的70个数据分析网址
  20. kafka-topics.sh java.rmi.server.ExportException: Port already in use: 5555

热门文章

  1. ##if语句与if语句的嵌套
  2. for each in 和 for in 和for of
  3. 整点报时程序,实用性强,适用WIN7及以上系统
  4. Codeforces Round #655 (Div. 2) ABCDEF题解
  5. [jeecms]获取父栏目下的子栏目名称
  6. 为租户下的虚机提供IPv6 DNS服务(by quqi99)
  7. logisim反应时间计时器设计
  8. 数字化营销,企业不可错失的裂变式增长机会
  9. 新组装的电脑,主板灯亮,开机没反应
  10. Qt实现中国象棋:(三)棋盘绘制的详细分析及实现