Codeforces Problem-1591C Minimize Distance
题目链接
基本思想:
这道题题目意思很清楚,一共有n个东西要送往n个目的地,一次最多拿k个物品,问最短的路程是多少。从算法的角度来说,一个极限的贪心思想(吓洗了904ms,差点TLE)。a数组记录目的地的远近(排个序),b数组记录总路程。对于负数来说,某种意义上可以把它转换为正数,在记录总里程的时候将a数组内容取反就行。总的路程数就是最远的里程加上二倍的其他里程。
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int M=200005;
ll a[M],b[M];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n,k;
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
int m=0;
for (int i=1;a[i]<0&&i<=n;i+=k)
b[++m]=-a[i];
for (int i=n;i>=1&&a[i]>0;i-=k)
b[++m]=a[i];
sort(b+1,b+m+1);
ll ans=b[m];
for (int i=1;i<m;i++)
ans+=2*b[i];
printf("%lld\n",ans);
}
return 0;
}