地址:https://acm.nefu.edu.cn/JudgeOnline/contestShow.php
题目大意:
///max(a,b)-min(a,b)在几何上表示一维坐标中线段ab的长度。学长说的,但我没用上,可能方法不同。
思路:
max(xi-xj,yi-yj)-min(xi-xj,yi-yj)=|(xi-xj)-(yi-yj)|=|(xi-yi)-(yi-yj)|=max(xi-yi,xj-yj)-min(xi-yi,xj-yj).
令zi=xi-yi;原式=max(zi,zj)-min(zi,zj)
当i=j时,zi-zj=0;i不等于j时,原式=max(zi,zj)-min(zi,zj);大的减小的,即大的在加位出现,小的在减位出现。
将z按从大到小的顺序排列,在题目中,每个zi出现了n-1次,其中z0在加位上出现了n-1次,在减位上出现了0次,z1在加位出现了n-1-2次,在减位上出现了2次,zi在加位上出现了n-1-2i次,在减位上出现了2i次。
所以我们得出了代码。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;
long long z[maxn];
bool cmp(long long a,long long b)
{
return a>b;
}
int main()
{
int t;
long long sum,n,i,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
for(i=0;i<n;i++)
{
scanf("%lld%lld",&x,&y);
z[i]=x-y;
}
sort(z,z+n,cmp);
sum=0;
for(i=0;i<n;i++)
{
sum+=z[i]*(n-1-2*i);
}
printf("%lld\n",sum);
}
return 0;
}