对局匹配(动态规划)
问题描述:
小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。
小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是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;
}
对局匹配(动态规划)相关推荐
- 历届试题 对局匹配-动态规划
问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起.如果两人分差 ...
- [蓝桥杯][历届试题 PREV-50]对局匹配(Java)(动态规划)
历届试题 对局匹配 时间限制:1.0s 内存限制:256.0MB 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系 ...
- 【蓝桥杯】历届试题 对局匹配(C++)
[蓝桥杯]历届试题 对局匹配(C++) 问题描述 解题思路 具体代码 问题描述 题目链接:对局匹配. 资源限制: 时间限制:1.0s 内存限制:256.0MB 问题描述: 小明喜欢在一个围棋网站上找别 ...
- 蓝桥杯第四日——对局匹配
问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起.如果两人分差 ...
- 蓝桥杯国赛 对局匹配(DP)
蓝桥杯国赛 对局匹配(DP) 题目描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是 K ...
- 2017蓝桥杯 对局匹配(贪心)
历届试题 对局匹配 时间限制:1.0s 内存限制:256.0MB 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在 ...
- #每日一题 对局匹配(dp)
试题 历届试题 对局匹配 资源限制 时间限制:1.0s 内存限制:256.0MB $Daily English 孩子害怕黑暗,情有可原:人生真正的悲剧,是成人害怕光明. We can easily f ...
- 【蓝桥杯】历届试题 对局匹配(贪心)
历届试题 对局匹配 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配 ...
- 蓝桥杯 java 历届试题 对局匹配
历届试题 对局匹配 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动 ...
最新文章
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数011,ocr,字符识别
- 最长回文子序列(LPS)
- kernel 下串口serial输入输出控制,屏蔽log的输出
- Makefile中的分析(一)
- 斜度符号标注_机械图纸尺寸标注规则,第1次见,太直观太形象了!测量工程师可以拿去教绘图的了!...
- 空间留言软件_电脑硬盘空间提示不足,原来还可以这么做,真是学到老活到老...
- MTK 8127平台使用busybox
- android Activity runOnUiThread() 方法的使用
- ubuntu16.04源码编译安装nginx1.16.2
- WinServer2003秘笈放送
- 《tensorflow实战》6——强化学习之策略网络
- 【C语言】请将1至7中的任意一个数字转化成对应的英文星期几的前三个字母,如1转化为Mon,7转化为Sun等。 个人解答
- 新零售全渠道营销,线上经营,线下成长
- matlab绘制收益率曲线并计算风险收益率VaR(Value At Risk)
- BCompare 4 key SN 亲测可用
- 十七、网上商城项目(3)
- Word | 日文文段注音方法 Win Mac
- ROS中的TF坐标变换
- 6.又双叒叕背包模拟
- VirtualBox命令行VBoxManage创建与管理虚拟机教程
热门文章
- 将你的网站从MySQL改为PostgreSQL
- 第9课:jvm的gc时候核心参数详解:-XX:NewRatio、-XX:SurvivorRatio、-XX:NewSize、-XX:MaxNewSize
- 专科程序员“霸面”蚂蚁金服,4轮面试,竟拿下offer(Java方向)
- 基于微信小程序的音乐播放器系统+后台管理系统(SSM+mysql)-JAVA.VUE【毕业设计、论文、源码、开题报告】
- 云计算迁移流程,主要分为哪几步?
- Django搭建个人博客:重置用户密码
- Pots (模拟倒水)
- JAVA 一个月多少天
- Ublox F9P通过NTRIP实现实时RTK定位
- 【C++】Heather银行对顾客排队等待的时间进行估测问题 《C++ Primer Plus》12.7 队列模拟 学习笔记