poj 1723

//士兵排队,最终站成一排,移动步数最少,这道题做的时候,
//我也是首先考虑了士兵最终到底站到哪一排才能使移动步数最少,
//也想到了,最终选定的那一排肯定是所有士兵的纵坐标的最大值和
//最小值之间的某个纵坐标处,但是到底怎样来确定这个位置呢,
//就再也没想到了~~~~,还是和做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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值