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

小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是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

再比如,
样例输入:
10 1
2 1 1 1 1 4 4 3 4 4

样例输出:
8

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

思路:
可以将所有的分数分为k组,比如说k如果等于2,那么可以分为2组,分别为{0,2,4,…10000},{1,3,5,7,…,9999},那么此时在同一个小组中人才有机会匹配到,不同的小组之间的人不可能匹配到,其次,再使用一个数组arr,来统计小组中每一个分数出现的次数,所以此时,我们对于每一个小组使用dp,dp[i]表示在同一个小组中前 i个分数中最多匹配不到的人数,此时状态转移方程为:
dp[i] = max(dp[i-2]+arr[i],dp[i-1])
dp[i-2]+val[i]表示选择当前的分数,那么此时肯定不从dp[i-1]转移过来,只能从dp[i-2]转移过来,dp[i-1]表示不选择当前的分数,直接从dp[i-1]转移过来,最后,由于k个小组之间两两不可能匹配,所以只需将每一个小组中最多的人数相加即可得到最终的答案。对于k等于0的情况要单独判断。

代码:

#include <iostream>
#include <cstdio>
using namespace std;const int max_scorce=100001;    //最大积分以及最大人数int cnt[max_scorce];    //统计不同积分的数目
int dp[max_scorce]; //当前满足条件的最大人数
int arr[max_scorce];    //当前积分的数目int main()
{int N,K;cin>>N>>K;//处理输入for(int i=0;i<N;i++){int scorce;scanf("%d",&scorce);cnt[scorce]++;  //统计该积分的数目}if(K==0)//处理特殊情况{int ans=0;for(int i=0;i<max_scorce;i++){if(cnt[i]!=0){ans++;}}printf("%d",ans);}else{int ans=0;for(int i=0;i<K;i++)//将所有分数分为K组{int index=0;for(int j=i;j<max_scorce;j+=K)//每一组以0-K-1开头,且以K为公差{arr[index++]=cnt[j];    //arr依次存放积分对应的数目}dp[0]=arr[0];for(int j=1;j<index;j++)   //动态规划,取第j个人数或者不取,dp[j]表示取到前j个数时满足条件的最大人数{if(j==1)    //情况特殊,开头两个只能二选一dp[j]=max(dp[0],arr[1]);else{dp[j]=max(dp[j-2]+arr[j],dp[j-1]);}}ans+=dp[index-1];//将个分组的情况求和}printf("%d",ans);}return 0;
}

对局匹配(动态规划)相关推荐

  1. 历届试题 对局匹配-动态规划

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

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

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

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

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

  4. 蓝桥杯第四日——对局匹配

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

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

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

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

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

  7. #每日一题 对局匹配(dp)

    试题 历届试题 对局匹配 资源限制 时间限制:1.0s 内存限制:256.0MB $Daily English 孩子害怕黑暗,情有可原:人生真正的悲剧,是成人害怕光明. We can easily f ...

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

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

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

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

最新文章

  1. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数011,ocr,字符识别
  2. 最长回文子序列(LPS)
  3. kernel 下串口serial输入输出控制,屏蔽log的输出
  4. Makefile中的分析(一)
  5. 斜度符号标注_机械图纸尺寸标注规则,第1次见,太直观太形象了!测量工程师可以拿去教绘图的了!...
  6. 空间留言软件_电脑硬盘空间提示不足,原来还可以这么做,真是学到老活到老...
  7. MTK 8127平台使用busybox
  8. android Activity runOnUiThread() 方法的使用
  9. ubuntu16.04源码编译安装nginx1.16.2
  10. WinServer2003秘笈放送
  11. 《tensorflow实战》6——强化学习之策略网络
  12. 【C语言】请将1至7中的任意一个数字转化成对应的英文星期几的前三个字母,如1转化为Mon,7转化为Sun等。 个人解答
  13. 新零售全渠道营销,线上经营,线下成长
  14. matlab绘制收益率曲线并计算风险收益率VaR(Value At Risk)
  15. BCompare 4 key SN 亲测可用
  16. 十七、网上商城项目(3)
  17. Word | 日文文段注音方法 Win Mac
  18. ROS中的TF坐标变换
  19. 6.又双叒叕背包模拟
  20. VirtualBox命令行VBoxManage创建与管理虚拟机教程

热门文章

  1. 将你的网站从MySQL改为PostgreSQL
  2. 第9课:jvm的gc时候核心参数详解:-XX:NewRatio、-XX:SurvivorRatio、-XX:NewSize、-XX:MaxNewSize
  3. 专科程序员“霸面”蚂蚁金服,4轮面试,竟拿下offer(Java方向)
  4. 基于微信小程序的音乐播放器系统+后台管理系统(SSM+mysql)-JAVA.VUE【毕业设计、论文、源码、开题报告】
  5. 云计算迁移流程,主要分为哪几步?
  6. Django搭建个人博客:重置用户密码
  7. Pots (模拟倒水)
  8. JAVA 一个月多少天
  9. Ublox F9P通过NTRIP实现实时RTK定位
  10. 【C++】Heather银行对顾客排队等待的时间进行估测问题 《C++ Primer Plus》12.7 队列模拟 学习笔记