题目描述:
给定一个个数为n(n%2==0)的数组,将任意两个数进行合并,合并的代价是x/k(x为两个数的和,向下取整),求一次合并的最小代价。
思路 :先对输入的数进行操作,把这个数中k的倍数取出来,然后对该数取余放入数组中;然后对数组排序,用双指针进行一次相加,算出最后答案。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void sove()
{
int n,m;
cin>>n>>m;
long long rec=0;
vector<int>v;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
rec+=a/m;
v.push_back(a%m);
}
sort(v.begin(),v.end());
for(int i=0,l=v.size()-1;i<l;i++)
{
if(v[i]+v[l]>=m)
{
rec++;
l--;
}
}
cout<<rec<<endl;
}
int main ()
{
int n;
cin>>n;
while(n--)sove();
}