士兵

题意描述

格兰德的N名士兵随机散布在全国各地。 Gridland中的位置由整数坐标对(x,y)给出。士兵们可以移动,一个士兵可以向上,向下,向左或向右移动一个单位(因此,他可以将x或他的y坐标改变1或-1)。士兵想要相互相邻的水平线(所以他们的最终位置是(x,y),(x + 1,y),…,(x + N-1,y) x和y)。整数x和y,以及沿水平线的士兵的最终顺序是任意的。 目标是尽量减少所有士兵的入场次数。 两名或两名以上的士兵在同一时间绝对不能占据同一位置。

输入

输入的第一行包含整数N,1 <= N <= 10000,士兵数。 输入的下面的N行包含的士兵的初始位置:对于每个i,1 <= I <= N,第(i + 1)第一输入文件的行包含一对整数x的[i]和Y [我用单个空白字符分隔,表示第i个士兵的坐标,-10000 <= x [i],y [i] <= 10000。

产量 ##

输出的第一行和唯一一行应包含使士兵相互相邻的水平线的最小移动次数。

样品输入


1 2
2 2
1 3
3 -2
3 3

样品输出

8

题意分析

  1. 本题使用到中位数和quickSort(qsort)函数
  2. 纵轴上走的最少步数是:y1,y2,y3,…,yn. (已经排好序的序列) y_mid = y[n/2], y_steps = ∑ ( |y[i]-y_mid| ).
  3. 横轴上走的最少步数是:x1,x2,x3,…,xn (已经排好序的序列)横轴的中位数是 (x[i]-i-1) 排序后的序列的中位数. x_mid = z[n/2] , x_steps = ∑( |z[i]-x_mid| )
  4. 结果: y_steps+x_steps.

代码

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
#define MAX 10005
int cmp(void const *a,void const *b)
{
       return *((int*)a) - *((int*)b);
}
int Abs(int x)
{
       if(x > 0)
             return x;
       else
             return -x;
}
int main()
{
      int n;
// freopen("a.txt","r",stdin);
      while(cin >> n)
     {
           int x[MAX] , y[MAX] , z[MAX];
           int i;
           int num = 0;
           for(i = 0; i < n; ++i)
           {
                 cin >> x[i] >> y[i];
           }
           qsort(x,n,sizeof(int),cmp);
           qsort(y,n,sizeof(int),cmp);
          for(i = 0; i < n; ++i)
                z[i] = x[i] - i - 1;
          qsort(z,n,sizeof(int),cmp);
          for(i = 0; i < n; ++i)
         {
                num += ( Abs(y[i]-y[n/2]) + Abs(z[i]-z[n/2]) );
         }
          cout << num << endl;
   }
      return 0;
}

测试截图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值