//士兵排队,最终站成一排,移动步数最少,这道题做的时候,
//我也是首先考虑了士兵最终到底站到哪一排才能使移动步数最少,
//也想到了,最终选定的那一排肯定是所有士兵的纵坐标的最大值和
//最小值之间的某个纵坐标处,但是到底怎样来确定这个位置呢,
//就再也没想到了~~~~,还是和做poj 3262的情况一样,数学问题,后来
//看看别人的理解,说是将纵坐标从小到大排序,然后求中位数,
//可是为什么要求中位数呢,再来看看中位数有什么代表性的意义吧,
//说是常用它来描述该组数据的集中趋势,也就是说士兵最终站的那一排
//应该是最初士兵比较集中的一排喽!可是每个士兵到达该排的步数又
//该怎么算呢,看了别人写的,还是不理解为什么那样求得的就是最优解
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int N,x[10005],y[10005],x1[10005],X,Y,sum;
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int i;
while(scanf("%d",&N)!=EOF)
{
sum=0;
for(i=0;i<N;i++)
scanf("%d %d",&x[i],&y[i]);
qsort(x,N,sizeof(x[0]),cmp);
for(i=0;i<N;i++)
x1[i]=x[i]-i;
//for(i=0;i<N;i++)
//printf("%d %d\n",x[i],x1[i]);
//printf("\n");
qsort(x1,N,sizeof(x1[0]),cmp);
X=x1[N/2];
for(i=0;i<N;i++)
sum+=abs(x1[i]-X);
//printf("%d\n",sum);
qsort(y,N,sizeof(y[0]),cmp);
Y=y[N/2];
for(i=0;i<N;i++)
sum+=abs(y[i]-Y);
printf("%d\n",sum);
}
system("pause");
return 0;
}
poj 1723
最新推荐文章于 2021-08-03 15:25:37 发布