poj1723

 

 如题:http://poj.org/problem?id=1723

  题目大意:将N个直角坐标系中的点变成一条连续水平线(x,y),(x+1,y).....(x+N-1,y) 任意2个点不能重合 一次移动一步

          输入:第一行N,下面N行坐标

         输出:最少走的步数

  

   这是一道用到排序的题目,首先将y坐标小到大排序,求出中位数ky=y【N/2】,因为易得,最少次数一定是点移动到中位数这个点,在y上移动的步数sum+=abs(ky-y[i])

   类似,然后对x从小到大排序,x上移动需要的步数为将x【0】,x[1]...x[n-1]移动到从kx开始的N个数,kx,kx+1.....kx+N-1,步数:abs(kx+0-x[0])+abs(kx+1-x[1])+....abs(kx+N-1-x[N-1])   最小 ,易得kx为新序列X【i】-i的中位数,x[i]-=i;求出后sum+=abs(x[i](新)-kx);即为题目所需的最终结果.

 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXN 10005

int x[MAXN];
int y[MAXN];

int cmp(const void * a,const void * b)
{
 return *(int *)a-*(int *)b;
}

int main()
{
 int N,i=0,sum=0,kx,ky;
 scanf("%d",&N);
  for(i=0;i<N;i++)
  {
   scanf("%d %d",&x[i],&y[i]);
  }
  qsort(x,N,sizeof(int),cmp);
  for(i=0;i<N;i++)
   x[i]-=i;
  qsort(y,N,sizeof(int),cmp);
  qsort(x,N,sizeof(int),cmp);
  kx=x[N/2];
  ky=y[N/2];
  for(i=0;i<N;i++)
  {
   sum+=(abs(y[i]-ky)+abs(x[i]-kx));
  }
 printf("%d",sum);
 return 0;
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值