题目

题目链接

题解

动态规划。


题目大意:
在一个具有nnn个元素的集合中选取尽可能多的数,保证这些数不存在两个数相差为kkk,求个数。
(题目讲的乱七八糟)


首先,我们统计每个数的个数,c[i]表示有多少个i
对于每个数,都可以选或者不选,若我们不选数i−ki-ki−k,则我们可以选数iii,也可以不选数iii;但若我们选数i−ki-ki−k,则我们绝不能选数iii了。还有一种很奇怪的情况,当数iii的个数为0时,我们根本就无法选这个数,因此我们完全可以选数i−ki-ki−k或者不选数i−ki-ki−k。


dp[i][0/1]表示数iii选或者不选时,iii的对应位上最多能选个数;0表示不选,1表示选;(这个对应位是我自己起的个名字,下面有讲解)
转移方程:
dp[i][0] = max(dp[i-k][0], dp[i-k][1])
dp[i][1] = max(dp[i-k][0], dp[i-k][1]) 当数iii的数量为0时
dp[i][1] = dp[i-k][0] + c[i] 当数iii的数量不为0时
初始化:我们只要初始化好最前面的kkk个就可以推出后面的了;前kkk个数(从集合中出现的最小值开始数k个数)中,若这个数在集合中不存在,则初始化为0,否则初始化为出现次数。
答案:最后kkk个数(从集合中出现的最大值开始向前数k个数)中,对于每个数选或不选的最大dp值之和。之所以答案是这个,是因为我们要找到0 ~ k-1的对应位上的最大dp值,对这些值累加,这就是我们的答案。


这个对应位,真是不好讲,准确的说并没有很严谨的定义。

iii的对应位就是i+ki+ki+k、i+2∗ki+2*ki+2∗k、……、i−ki-ki−k、i−2∗ki-2*ki−2∗k、……
以下面的样例的初始化为例,

10 3
0 0 1 1 3 3 4 6 7 7

初始化前3个,即0、1、2;
dp[0][1] = 2, dp[1][1] = 2, dp[2][1] = 0
dp[0][0] = 0, dp[1][0] = 0, dp[2][0] = 0
dp[3][1]保存的是在数1和数3中进行选择,保证最终集合中不能出现两个数相差为3的集合个数最大值;
同理,dp[6]保存的是在数1、数3和数6中进行选择,保证最终集合中不能出现两个数相差为3的集合个数最大值。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long ll;int n, k, mx, mn = N, x;
ll dp[N][2], ans, c[N];int main()
{cin>>n>>k;for(int i = 1;i <= n;i ++) cin>>x, c[x] ++, mx = max(x, mx), mn = min(x, mn);if(k == 0) { // k为0时特判,答案等于不同数的个数 for(int i = mn;i <= mx;i ++) ans += bool(c[i]);cout << ans << endl;return 0;}for(int i = mn;i <= min(mn+k-1, mx);i ++) dp[i][0] = 0LL, dp[i][1] = c[i]; // 初始化dp[mn ~ mn+k-1],若选索引的值这个数,则数量为统计的数量,若不选则为0;取min是为了防止超出mx,即最大范围 for(int i = min(mn+k-1, mx) + 1;i <= mx;i ++) { // 动态规划 dp[i][0] = max(dp[i-k][0], dp[i-k][1]); // 若不选i这个数,则值为i-k的数可以选,也可以不选 // 选i这个数 if(c[i]) dp[i][1] = dp[i-k][0] + c[i]; // 若i这个数的个数不为0,选i就不能选i-k else dp[i][1] = max(dp[i-k][0], dp[i-k][1]); // 若i这个数的个数为0,则i-k这个数还是可以选的,这与dp[i][0]一致了 } for(int i = max(mx-k+1, mn);i <= mx;i ++) ans += max(dp[i][0], dp[i][1]); // 统计最后k个的dp和;取max是为了防止不大于mx的数的总个数不足k个 cout << ans << endl;return 0;
}

蓝桥杯2017年第八届真题-对局匹配相关推荐

  1. [蓝桥杯][2017年第八届真题]对局匹配

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

  2. c语言存储对局信息,[蓝桥杯][2017年第八届真题]对局匹配 (C语言代码)

    解题思路:   这道题要求找出最大同时在线但不能匹配对局的用户数,我用的思路是动态规划,因为每两个相邻为K的用户都可以匹配,如果直接暴力搜索会出现牵一动百的情况,下面我来说一下我的思路: 数据存储方式 ...

  3. [蓝桥杯][2017年第八届真题]包子凑数(解题报告)

    问题 1886: [蓝桥杯][2017年第八届真题]包子凑数 时间限制: 1Sec 内存限制: 128MB 提交: 406 解决: 118 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家 ...

  4. 题目 1886: 蓝桥杯2017年第八届真题-包子凑数

    时间限制: 1Sec 内存限制: 128MB 提交: 2378 解决: 789 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼 ...

  5. 题目 1878: 蓝桥杯2017年第八届真题-青蛙跳杯子

    题目 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙. ...

  6. [蓝桥杯][2017年第八届真题]小计算器(模拟)

    题目描述 模拟程序型计算器,依次输入指令,可能包含的指令有 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个当前进制的数 运算指令:'ADD','SUB','MUL','DIV', ...

  7. [蓝桥杯][2017年第八届真题]小数第n位(数学)

    题目描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...

  8. 题目 1885: [蓝桥杯][2017年第八届真题]分巧克力+二分

    题目: 题目描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧克 ...

  9. [蓝桥杯][2017年第八届真题]合根植物

    题目描述 w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列).每个格子里种了一株合根植物. 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成 ...

最新文章

  1. Kafka设计解析(二):Kafka High Availability (上)
  2. 返回用户指定页面的web服务器
  3. 002_JavaScript的历史
  4. 全球及中国临床试验支持服务行业十四五规模发展及应用前景调研报告2022-2027年
  5. saiav.win forum.php,【emWin实战教程V2.0】第4章    emWin5.xx的裸机方式移植(F4
  6. mysql 8.0数据备份恢复_MySQL 8.0 增强逻辑备份恢复工具介绍-爱可生
  7. centos7+svn+mysql_Linux下安装SVN服务(CentOS7下)
  8. KVM中断虚拟化(一)
  9. 2021-09-01
  10. 数据结构与算法之图入门
  11. VPX单板计算机xPower 6110
  12. LaTeX 语法教程
  13. ffmpeg转码视频
  14. Python学习:IndentationError: expected an indented block
  15. java 对Excel 操作 例子(上)
  16. Maven Helper 安装使用
  17. 教你如何查询车辆出险记录
  18. 在知乎匿名发差评,高校学生遭起诉判赔3272元
  19. day2-----k8s集群管理常用知识点(1)
  20. 集成灶怎么选品牌(拒绝陷阱避坑指南)

热门文章

  1. 更高的等级、更强的暴力
  2. Java 爬取微信公众号文章(文字 + 图片)
  3. 计算机数字媒体专业毕业论文,数字媒体艺术专业毕业论文
  4. 移动互联应用开发基础知识简答
  5. 加拿大计算机cs专业,加拿大CS专业全面详解
  6. Mongodb 设置账号密码
  7. shl and shr
  8. linux 批量ping多个连续的IP地址
  9. 控制建模matlab练习02:状态空间方程系统
  10. CC00382.CloudKubernetes——|KuberNetesCI/CD.V20|——|Jenkins.v08|kubeconfig多集群配置.v02|