zoukankan      html  css  js  c++  java
  • 士兵站队

    【问题描述】
           在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点由整数坐标(x,y)表示。士兵们可以沿网格边上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x 和y的值才能使士兵们以最少的总移动步数排成一列。
    【编程任务】
           计算使所有士兵排成一行需要的最少移动步数。
    【输入格式】
           由文件sol.in提供输入数据。文件的第1 行是士兵数n,1≤n≤10000。接下来n 行是士兵的初始位置,每行2 个整数x 和y,-10000≤x,y≤10000。
    【输出格式】
           程序运行结束时,将计算结果输出到文件sol.out中。文件的第1 行中的数是士兵排成一行需要的最少移动步数。
    【输入样例】
    5
    1 2
    2 2
    1 3
    3 -2
    3 3
     

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    int n;
    using namespace std;
    int x[500001],y[500001];
    /*void kp(int l,int r)
    {
    int mid,i,j,p;
    mid=a[(l+r)/2];
    i=l; j=r;
    do
    {
    while(a[i]<mid) i++;
    while(a[j]>mid) j--;
    if(i<=j)
    {
    p=a[i];
    a[i]=a[j];
    a[j]=p;
    i++;
    j--;
    }
    }
    while(i<=j);
    if(l<j) kp(l,j);
    if(i<r) kp(i,r);
    }*/
    void kp(int a[],int l,int r)
    {
    int mid,i,j,p;
    mid=a[(l+r)/2];
    i=l;j=r;
    do
    {
    while(a[i]<mid) i++;
    while(a[j]>mid) j--;
    if(i<=j)
    {
    p=a[i];
    a[i]=a[j];
    a[j]=p;
    i++;j--;
    }
    }
    while(i<=j);
    if(l<j) kp(a,l,j);
    if(i<r) kp(a,i,r);
    }
    int main()
    {
    int t,sum=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    cin>>x[i]>>y[i];
    }
    kp(x,1,n);
    kp(y,1,n);
    for(int i=1;i<=n;i++)
    x[i]-=i;
    kp(x,1,n);
    int kx=x[n/2+1],ky=y[n/2+1];
    for(int i=1;i<=n;i++)
    sum+=abs(kx-x[i]);
    for(int i=1;i<=n;i++)
    sum+=abs(ky-y[i]);
    cout<<sum;
    }

  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/lutongxi/p/5193209.html
Copyright © 2011-2022 走看看