链接:https://codeforces.com/contest/1133/problem/B
题意:
给n个数,和一个k,在n个数中选几对数,保证没对数相加可以整除k。
求最大能选几个数。
思路:
记录每个数mod k的值。
通过mod k的值为多少的数的数量,计算对数。
例 k = 3时。mod k为1 和 mod k 为2 的数可以组成一对满足的数。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 10;
int Mod[MAXN];
int main()
{
int n, k, a;
cin >> n >> k;
for (int i = 1;i <= n;i++)
{
cin >> a;
Mod[a % k] ++;
}
int res = Mod[0] / 2;
for (int i = 1;i < k/2;i++)
{
int ma = min(Mod[i], Mod[k - i]);
res += ma;
Mod[i] -= ma;
Mod[k - 1] -= ma;
}
if (k % 2 == 0)
res += Mod[k / 2] / 2;
else
res += min(Mod[k / 2], Mod[k - k / 2]);
cout << res * 2 << endl;
return 0;
}