【题目描述】


众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

【输入格式】
从标准输入读入数据。

第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。

【输出格式】
输出到标准输出。
输出一行一个整数代表所求的和。

【样例入】
4 3
1 2 3 4

【样例输出】
9

【样例解释】
选择2、3、4。

【数据约定】
对于 30% 的数据,n <= 100。
对于 60% 的数据,n <= 1000。
对于另外 20% 的数据,K <= 10。
对于 100% 的数据,1 <= n <= 10^5, 1 <= K <= 10^3,给定的 n 个数均不超过 10^8。

解题思路:


暴力O(n^3),只能拿一部分的分

dp:一个状态是合法的,它肯定是由另一个合法状态转化过来的

决策过程和背包问题(n件物品,w[i]和v[i],选择w[i]之和不超过M,且v[i]之和最大)类似,但有些需要注意的点

将v[i]%k作为w[i],(a+b+c)%k==0等价于(a%k+b%k+c%k)%k==0

状态转移方程:

dp[j+1][(t+w[i])%k]=max(dp[j][t]+v[i],dp[j+1][(t+w[i])%k])  选第i个和不选第i个 (j==0&&t==0)||dp[j][t]

注意:j的遍历从2~0,且放在t循环的外面一层!!

ac代码:


#include <iostream>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#define maxn 100005
using namespace std;
int n,k;
int dp[5][1005]={0},w[maxn],v[maxn];
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d %d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&v[i]);w[i]=v[i]%k;}for(int i=1;i<=n;i++){for(int j=2;j>=0;j--){for(int t=k-1;t>=0;t--){if((j==0&&t==0)||dp[j][t])//选了0个和模k为0 or 已经选好了j个和模k为t,更新选j+1个时dp值dp[j+1][(t+w[i])%k]=max(dp[j][t]+v[i],dp[j+1][(t+w[i])%k]);//选v[i]和不选v[i]}}}cout<<dp[3][0]<<endl;return 0;
}

测试样例:

11 3
1 3 6 2 5 7 4 49 21 43 21

输出:99

【2018蓝桥省赛A组C/C++】倍数问题(dp+滚动数组)相关推荐

  1. 2018蓝桥模拟赛·天上的星星 暴力|二维树状数组

    在一个星光摧残的夜晚,蒜头君一颗一颗的数这天上的星星. 蒜头君给在天上巧妙的画了一个直角坐标系,让所有的星星都分布在第一象.天上有 nn 颗星星,他能知道每一颗星星的坐标和亮度. 现在,蒜头君问自己  ...

  2. 【NOIP2015提高组】子串 区间DP+滚动数组优化

    题意: 有两个仅包含小写英文字母的字符串 A 和 B. 现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串. 请问 ...

  3. [蓝桥杯]2016蓝桥省赛B组题目及详解

    /*----------------------------------------------------------- [结果填空题]T1 (分值:3) 题目:煤球数目有一堆煤球,堆成三角棱锥形. ...

  4. 2018蓝桥模拟赛(一) 数独(dfs)

    题目描述 蒜头君今天突然开始还念童年了,想回忆回忆童年.他记得自己小时候,有一个很火的游戏叫做数独.便开始来了一局紧张而又刺激的高阶数独.蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出 ...

  5. 2018蓝桥杯C++A组:三角形面积(海伦公式;向量的叉积)

    一.题目:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3,2.5) (6.4,3.1) (5.1,7.2) 求该三角形的面积. 提交小数形式表示浮点数,精确到小数点后三位. 分析 ...

  6. 2018蓝桥模拟赛 天上的星星

    在一个星光摧残的夜晚,蒜头君一颗一颗的数这天上的星星. 蒜头君给在天上巧妙的画了一个直角坐标系,让所有的星星都分布在第一象.天上有 nn 颗星星,他能知道每一颗星星的坐标和亮度. 现在,蒜头君问自己  ...

  7. 19蓝桥国赛B组C/C++ I第八大奇迹

    题意: 有一条河,沿河的一侧生活着一个部落.这个一字型的部落有n个据点,从左至右依次编号1~n. 部落的人们有时会在某个据点建立建筑,每个建筑都有各自的价值.一开始,每个据点的都没有建筑,价值都是0. ...

  8. 2018蓝桥杯C++A组——星期一

    目录 问题描述 题目解析 C++代码 正确答案 问题描述 整个20世纪(1901年1月1日至2000年12月31日之间),一共有多少个星期一? 注意:需要提交的只是一个整数,不要填写任何多余的内容或说 ...

  9. YbtOJ#20067-[NOIP2020模拟赛B组Day5]糖果分配【dp】

    正题 题目链接:http://noip.ybtoj.com.cn/contest/102/problem/1 题目大意 nnn个xix_ixi​在[li,ri][l_i,r_i][li​,ri​]中随 ...

  10. YbtOJ#20065-[NOIP2020模拟赛B组Day4]模拟比赛【dp】

    正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/3 解题思路 有nnn道题,mmm个人.一些题目是让某些人一定得分,一些题目是让某些人可以能得分 ...

最新文章

  1. 第3关:单链表循环队列
  2. 从FTP建立连接模式想到的TCP SYNFlood防御
  3. 作业——Windows核心编程学习手札系列之五
  4. SpringBoot基础重难点
  5. TCP协议属性设置之SO_LINGER属性
  6. pandas中inplace_pandas回顾小结(二)
  7. 手机网页播放器php,html5手机移动端视频播放代码插件
  8. CSP-J NOIP NOI数学与动态规划
  9. PHP超级全局变量总结
  10. 云计算学习教程,Python自动化运维开发实战
  11. Python核心编程学习日记之模块
  12. SFB 项目经验-15-配置会议邀请中企业信息
  13. c语言函数与宏定义的应用,C语言第3次实_函数与宏定义的应用.doc
  14. zmap扫描mysql_zmap快速扫描
  15. laravel使用dompdf总结
  16. 小码哥C++_面向对象
  17. 墙裂推荐5款做微商必备的软件
  18. 计算机应用基础图文混合排版,《Word 2010图文混合排版》教学设计与课后反思
  19. VisualStudio/VS在一个项目中添加多个c++文件
  20. 2023校招荣耀笔试

热门文章

  1. 我的博客也是男的(还好)
  2. 【算法】排序_选择排序及其优化
  3. 常用类字符串详解大全String
  4. python包管理工具pip_pip_python包管理工具(pip)下载 v9.0.1官方版 - 121下载站
  5. java程序设计颜志军_信息管理系统设计方案.doc
  6. 【转】C# SqlServer操作辅助类(SqlServerHelper.cs)
  7. CSS兼容IE6,IE7和FF的总结
  8. 推荐一个插件: The Great Suspender,大大减少chrome浏览器内存占用量
  9. 如何在阿里云里申请并使用免费https证书SSL、nginx下配置https证书
  10. 【译】2018 年前端开发回顾