如何做环保管家网站,网站修改用什么工具,微信服务号菜单链接网站怎么做,免费做的英文网站众所周知#xff0c;小葱同学擅长计算#xff0c;尤其擅长计算一个数是否是另外一个数的倍数。 但小葱只擅长两个数的情况#xff0c;当有很多个数之后就会比较苦恼。 现在小葱给了你 n 个数#xff0c;希望你从这 n 个数中找到三个数#xff0c;使得这三个数的和是 K 的倍…众所周知小葱同学擅长计算尤其擅长计算一个数是否是另外一个数的倍数。 但小葱只擅长两个数的情况当有很多个数之后就会比较苦恼。 现在小葱给了你 n 个数希望你从这 n 个数中找到三个数使得这三个数的和是 K 的倍数且这个和最大。 数据保证一定有解。
输入格式 第一行包括 2 个正整数 n, K。 第二行 n 个正整数代表给定的 n 个数。
输出格式 输出一行一个整数代表所求的和。
数据范围 1≤n≤10^5, 1≤K≤10^3, 给定的 n 个数均不超过 10^8 输入样例 4 3 1 2 3 4 输出样例 9
代码如下
#include iostream
#include vector
#include cstring
#include algorithm
using namespace std;
const int N 1010;
int f[4][N];
vectorint a[N];
int main()
{int n,m;cinnm;for (int i 0;in;i){int x;cinx;a[x%m].push_back(x);}memset(f,-0x3f,sizeof(f));f[0][0] 0;for (int i 0;im;i){sort(a[i].begin(),a[i].end());reverse(a[i].begin(),a[i].end());for (int u 0;u3 u a[i].size();u){int t a[i][u];for (int j 3;j1;j--)for (int k 0;km;k){f[j][k] max(f[j][k],f[j-1][((k-t)%mm)%m]t);}}}coutf[3][0]endl;return 0;
}