Description
总所周知,韩信是一位神勇的军事家。某日夜幕,敌方突然来袭,韩信作为塞外将帅吹响紧急的号角。各个帐内的士兵听见号角立即集合,站成一排,排成连续的一队。但是士兵太多了,如果让他们集合耗费太多精力就没有办法打好接下来的胜仗,因此韩信希望选择一个最优的方案使得所有士兵从帐内移动到将要站队的位置的曼哈顿距离和最小!
Input
第一行输入一个整数n表示士兵数量;
接下来n行,每行输入两个整数xi,yi,表示第 i 名士兵帐篷的坐标。
Output
请输出一个整数,表示所有士兵从帐内移动到将要站队的位置的距离和。
Hint
站成一排的意思是最终队列中士兵们的纵坐标相同,横坐标排成连续的一段区间。
答案可能会超过int
范围,使用printf
输出64整数请使用%lld
!
思路
先y后x。对于y,寻找中位数,求出差值之和。对于x,先排序,更改元素后再排一次,之后同y。
注意:1、使用函数可大大降低难度(qsort很好用 2、注意输出格式,题目中已经提醒了
代码
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
long long ansx =0,ansy = 0;
int arrx [100010] = {0};
int arry [100010] = {0};
int comint(const void*el1,const void*el2)
{
return *(int*)el1-*(int*)el2;
}
int main()
{
int num = 0; int i = 0; int x = 0,y = 0;
scanf("%d/n",&num);//输入
for(i = 0; i < num; i++)
{
scanf("%d %d",&arrx[i],&arry[i]);
}
qsort(arry,num,sizeof(arry[0]),comint);//算y
y=num/2; y=arry[y];
for(i = 0; i < num; i++)
{
ans y+= abs(arry[i]-y);
}
qsort(arrx,num,sizeof(arrx[0]),comint);//算x
for(i = 0; i < num; i++)
{
arrx[i] -= i;
}
qsort(arrx,num,sizeof(arrx[0]),comint);
x=num/2; x=arrx[x];
for(i = 0; i < num; i++)
{
ansx += abs(arrx[i]-x);
}
ansx += ansy;
printf("%lld\n",ansx);
return 0;
}