士兵站队
题目描述
在一个划分成网格的操场上,nnn 个士兵散乱地站在网格点上,由整数坐标 (x,y)(x,y)(x,y) 表示。
士兵们可以沿网格边上、下左右移动一步,但在同时刻任一网格点上只能有 1 名士兵。
按照军官的命令,他们要整齐地列成一个水平队列,即排成队列,即排成 (x,y),(x+1,y),…,(x+n−1,y)(x,y),(x+1,y),\ldots,(x+n-1,y)(x,y),(x+1,y),…,(x+n−1,y)。请求出如何选择 xxx 和 yyy 的值才能使士兵们以最少的总移动步数排成一列。
输入格式
输入的第一行是一个整数,代表士兵数 nnn。
第 222 到 (n+1)(n + 1)(n+1) 行,每行 222 个整数,第 (i+1)(i + 1)(i+1) 行的整数 xi,yix_i, y_ixi,yi 代表第 iii 个士兵的坐标。
输出格式
输出一行一个整数,代表答案。
样例 #1
样例输入 #1
5
1 2
2 2
1 3
3 -2
3 3
样例输出 #1
8
提示
对于 100%100\%100% 的数据,保证 1≤n≤100001 \leq n \leq 100001≤n≤10000,−10000≤x,y≤10000-10000 \leq x,y \leq 10000−10000≤x,y≤10000。
C++实现
#include
#include
#include
using namespace std;
int n,x[10005],y[10005],ans=0,rex,rey;
int main()
{
scanf(“%d”,&n);
for(int i=1;i<=n;i++) scanf(“%d%d”,x+i,y+i);
sort(x+1,x+n+1); sort(y+1,y+n+1);
for(int i=1;i<=n;i++) x[i]-=i;
sort(x+1,x+n+1);
if(!n%2)
{
rex=(x[n/2]+x[n/2+1])/2;
rey=(y[n/2]+y[n/2+1])/2;
}
else{
rex=x[n/2+1];
rey=y[n/2+1];
}
for(int i=1;i<=n;i++) ans+=abs(x[i]-rex)+abs(y[i]-rey);
printf(“%d”,ans);
return 0;
}

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++工具信奥P1889 普及组提高 士兵站队&spm=1001.2101.3001.5002&articleId=143774769&d=1&t=3&u=ef43dae970534f20b3bf0d518946140f)
3080

被折叠的 条评论
为什么被折叠?



