码迷,mamicode.com
首页 > 其他好文 > 详细

soldiers

时间:2020-03-07 09:52:02      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:pair   中位数   ios   转化   c++   long   cin   pac   直接   

# 题意
n名士兵,每个士兵的位置由一对整数(x,y)来表示,士兵可以进行移动,每一次可以上下左右移动,通过移动使所有士兵处于同于水平线,即y相同x相邻,求最少的移动次数,每个士兵只能占据一个单独的位置。

# 题解
如果单纯的对横坐标求中位数,不能满足相邻这一个条件,
对x进行排序后,要求使得士兵全部相邻的最小移动次数.那么在移动前和移动后,士兵的相对位置是不变的.
举例来说,记add为移动后的最左端的士兵的前一位置
x[ 1 ] -> add + 1;
x[ 2 ] -> add + 2;

x[ n ] -> add + n;
转换一下
x[ 1 ] - 1 -> add;
x[ 2 ] - 2 -> add;

x[ n ] - n -> add;
处理过后,就转化为了移动到同一个点的情况,可以直接用中位数来做

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define ld long double
 4 #define pii pair<int,int>
 5 using namespace std;
 6 const int N=1e4+10;
 7 int x[N],y[N];
 8 int n;
 9 int main(){
10    ios::sync_with_stdio(0);
11    cin.tie(0);
12    cout.tie();
13    cin>>n;
14    int ans=0;
15    for(int i=1;i<=n;i++)
16       cin>>x[i]>>y[i];
17    sort(x+1,x+1+n);
18    sort(y+1,y+1+n);
19    for(int i = 1; i <= n; i++)
20       x[i]-=i;
21    sort(x+1,x+1+n);
22 
23 
24    for(int i = 1; i <= n; i++)
25       ans += abs(x[i] - x[(n+1)>>1]);
26 
27    for(int i = 1; i <= n; i++)
28       ans += abs(y[i] - y[(n+1)>>1]);
29    cout<<ans;
30 }

 

soldiers

标签:pair   中位数   ios   转化   c++   long   cin   pac   直接   

原文地址:https://www.cnblogs.com/hhyx/p/12432268.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!