标题:对局匹配

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

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

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

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

输入

第一行包含两个个整数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

样例输入:

10 1

2 1 1 1 1 4 4 3 4 4

样例输出:

8

资源约定:

峰值内存消耗 < 256M

CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

思路

  如果把nn个元素按照将分数相差为k的用户分成一组,例如第一组就是{0,k,2k,3k…}{0,k,2k,3k…},第二组就是{1,k+1,2k+1…}{1,k+1,2k+1…},等等。这样分组的话,每个分组的用户是不可能和其他分组的用户匹配成功的,因为分差不可能为kk。

  这样的话,只要在每个分组里面选取尽量多的用户就可以了。用cnt(i)cnt(i)表示分数为ii的用户人数,假设现在第ii组有mm个不同分数{x,x+k,x+2k,…,x+(m−1)k}{x,x+k,x+2k,…,x+(m−1)k},其中xx表示该组第一个人的积分,那么用动态规划法来选择尽量多的人数。dp(j)dp(j)表示选择前jj个分数能获得的最大用户人数(价值),很明显如果选择第jj个分数,那么第j−1j−1个分数是不能选的,因为它们的积分相差kk,该组最大在线人数为dp(m)dp(m)。

  状态转移方程如下:

dp(i)=max{dp(i−1),dp(i−2)+cnt(score)}dp(i)=max{dp(i−1),dp(i−2)+cnt(score)}

  其中cnt(score)cnt(score)表示积分为第ii个分数的总人数。是否感觉上述动态方程与01背包很类似?

需要注意的是,k=0k=0要特殊处理。

算法复杂度

O(100000)O(100000),只与最大分数有关。

AC代码

import java.util.Scanner;

public class duijupipei {
public static void main(String[] args) {
int res = 0;
Scanner cin = new Scanner(System.in);
int N = cin.nextInt();
int k = cin.nextInt();
int[] val = new int[100001];
//如果k不等于0,
for(int i=0;i<N;i++) {
val[cin.nextInt()]++;
}
cin.close();
if(k==0) {
for(int i=0;i<100001;i++) {
if(val[i]!=0) res++;
}
}
else {
int[] agroup = new int[100001];//一个组,每次循环,重新利用这个组
int[] dp = new int[100001];
//一共有k个组,循环每组,找出能过匹配的最大的人数
for(int i=0;i<k;i++) {
int len = 1;
for(int j=i;j<100001;j+=k) {
agroup[len++] = val[j];//当前组的第len个值为val[j]
}
dp[0] = 0;dp[1] = agroup[1];
for(int j=2;j<len;j++) {
dp[j] = Math.max(dp[j-1], dp[j-2]+agroup[j]);
}
res += dp[len-1];
}
}
System.out.println(res); } }

Java实现蓝桥杯第八届决赛 对局匹配的更多相关文章

  1. 日期求星期(java)-蓝桥杯

    日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...

  2. Java实现 蓝桥杯VIP 基础练习 高精度加法

    java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...

  3. Java实现蓝桥杯 算法训练 ALGO-15 旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  4. Java实现 蓝桥杯VIP 基础练习 完美的代价

    package 蓝桥杯VIP; import java.util.Scanner; public class 完美的代价 { public static int sum = 0; public sta ...

  5. java实现 蓝桥杯 算法训练 Password Suspects

    问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...

  6. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  7. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  8. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  9. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

随机推荐

  1. Mybatis使用ResultMap

    解决字段名和属性名不一致的问题 - 新建数据库表的字段-这里就不贴上了 在下面链接有 https://www.cnblogs.com/rzkwz/p/12853899.html 设置实体类和数据库字段 ...

  2. 高性能mysql第三版读书笔记3

    innodb以前不支持高并发,在搞病房下就是悲剧,全部卡在mutex(缓冲池mutex)上,现在通过线程调度器控制线程怎么进入内核访问数据,参数为innodb_thread_concurrency,它 ...

  3. OpenWrt R2020.3.19 反追踪 抗污染 加速 PSW 无缝集成 UnPnP NAS

    固件说明 基于Lede OpenWrt R2020.3.19版本Lienol Feed及若干自行维护的软件包 结合家庭x86软路由场景需要定制 按照家庭应用场景对固件及软件进行测试,通过后发布 设计目 ...

  4. 字节码编程,Javassist篇三《使用Javassist在运行时重新加载类「替换原方法输出不一样的结果」》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 通过前面两篇 javassist 的基本内容,大体介绍了:类池(ClassPool) ...

  5. FPGA六位共阳极数码管动态显示

    `timescale 1ns/1ps module adc_dis( clk , rst_n , sm_seg , sm_bit ); input clk;//50HZ input rst_n; :] ...

  6. Rabbitmq 整合Spring,SpringBoot与Docker

    SpringBootLearning是对Springboot与其他框架学习与研究项目,是根据实际项目的形式对进行配置与处理,欢迎star与fork. [oschina 地址] http://git.o ...

  7. 关于tez-ui的"All DAGs"和"Hive Queries"页面信息为空的问题解决过程

    近段时间发现公司的HDP大数据平台的tez-ui页面不能用了,页面显示为空,导致通过hive提交的sql不能方便地查找到Yarn上对应的applicationId,只能通过beeline的屏幕输出信息 ...

  8. 五一以来,国产手机受到cmtwg, nkvhu, qhsz等几款恶意软件肆虐。

    受影响手机包括魅族,中国移动等国产手机. 5月12日开始有人在百度知道提问cmtwg,5月13日mx吧也有人在发贴. 我接到有问题的手机时间更早,大约就是五一之后. 出现问题的几个牌子的国产手机,似乎 ...

  9. 网站设计时应考虑哪些因素,以保证网站是对SEO友好

    根据用户的搜索习惯做好栏目的设计 根据用户的习惯做好三大标签的设计 做好首页栏目的展现布局  对于用户来说的重点 展示栏目的合理化 多样化 细节化 代码的静态化 域名 服务器购买稳定 合格 网站内容的 ...

  10. 一个学习 Koa 源码的例子

    作者: MarkLin 学习目标: 原生 node 封装 中间件 路由 Koa 原理 一个 nodejs 的入门级 http 服务代码如下, // index.js const http = requ ...