## 主要题意:
有 $n$ 个礼物,要两两合并,然后除以 $k$ 最后求和最大。
## 思路:
先加入每个数除以 $k$ 的商(单独组成 $k$ 的个数),然后全部 $ \bmod \ k$ 存入数组,排序,最后双指针一个前一个后求两个余数可以大于等于 $k$ 的两个礼物。
## 代码:
```cpp
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 2e5 + 5;
int n, t, a[Maxn], k, l, r;
long long cnt;
int main()
{
ios::sync_with_stdio(0);//其实不用快读
cin.tie(), cout.tie();//关同步流即可
cin >> t;
while (t--)
{
cnt = 0;
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
cnt += a[i] / k;//求单独组成k的数
a[i] = a[i] % k;//求余数
}
sort(a + 1, a + 1 + n);//排序
l = 1;
r = n;
while (l < r)
{
while (a[l] == 0)
{
l++;//0是无论如何也不能组成k的
}
while ((a[l] + a[r]) % k == 0 && l < r)//等于时
{
cnt++;
l++;
r--;
}
while (a[l] + a[r] > k && l < r)//大于时(其实可以合并)
{
cnt++;
r--;
l++;
}
while (a[l] + a[r] < k && l < r)//小于
{
l++;
}
}
cout << cnt << "\n";
}
return 0;
}
```