倍数问题
题目描述
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。
输入格式
从标准输入读入数据。
第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。
输出格式
输出到标准输出。
输出一行一个整数代表所求的和。
样例输入
4 3
1 2 3 4
样例输出
9
样例解释
选择2、3、4。
int N, k;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> k;
vector<vector<int>> vec(k, vector<int>(3, -1));
for (int i = 0; i < N; ++i)
{
int temp;
cin >> temp;
int y = temp % k;
if (temp > vec[y][0])
{
vec[y][2] = vec[y][1];
vec[y][1] = vec[y][0];
vec[y][0] = temp;
}
else if (temp > vec[y][1])
{
vec[y][2] = vec[y][1];
vec[y][1] = temp;
}
else if (temp > vec[y][2])
vec[y][2] = temp;
}
vector<int> ans(3);
int result = 0;
for (int i = 0; i < k; ++i)
for (int j = i; j < k; ++j)
{
int r = (k - i + k - j) % k;
ans[0] = vec[i][0];
if (i == j)
{
ans[1] = vec[i][1];
if (r == i)
ans[2] = vec[i][2];
else
ans[2] = vec[r][0];
}
else
{
ans[1] = vec[j][0];
if (r == i)
ans[2] = vec[i][1];
else if (r == j)
ans[2] = vec[j][1];
else
ans[2] = vec[r][0];
}
if (ans[0] != -1 && ans[1] != -1 && ans[2] != -1 && ans[1] + ans[2] + ans[0] > result)
result = ans[1] + ans[2] + ans[0];
}
cout << result;
}