POJ1723----SOLDIERS

来源:互联网 发布:行知小学 程洁 编辑:程序博客网 时间:2024/05/21 06:29

利用了中位数思想。

借鉴内容1  y方向:要使士兵最后位于同一水平线,则最终所有士兵的y坐标相同。将所有坐标的y值从小到大排序,对于首尾两个y值,移动到它们之间的任何y值所需要的步数是相同的,所以 最终的y值取中位数。y方向的步数y_steps=|y[0]-y_mid|+|y[1]-y_mid|+...+|y[n-1]-y_mid|,y_mid=y[n/2]。2  x方向:x方向稍微复杂点,先对所有x坐标从小到大排序,由于要移动步数最少,所以最终的x坐标相对位置与排序后的x坐标相对位置相同。
#include<stdio.h>#include<algorithm>#include<iostream>#include<math.h>#include<string>#include<string.h>#include<algorithm>using namespace std;int main(){    int n;    int x[10010],y[10010];    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)        scanf("%d%d",&x[i],&y[i]);                sort(y,y+n);        int k=y[n/2];        int s=0;        for(int i=0;i<n;i++)            s+=fabs(k-y[i]);        sort(x,x+n);        for(int i=0;i<n;i++)            x[i]-=i;//相对位置不变        sort(x,x+n);        k=x[n/2];        for(int i=0;i<n;i++)            s+=fabs(k-x[i]);        printf("%d\n",s);    }}




0 0
原创粉丝点击