11.排兵布阵

Description

总所周知,韩信是一位神勇的军事家。某日夜幕,敌方突然来袭,韩信作为塞外将帅吹响紧急的号角。各个帐内的士兵听见号角立即集合,站成一排,排成连续的一队。但是士兵太多了,如果让他们集合耗费太多精力就没有办法打好接下来的胜仗,因此韩信希望选择一个最优的方案使得所有士兵从帐内移动到将要站队的位置的曼哈顿距离和最小

Input

第一行输入一个整数n表示士兵数量;

接下来n行,每行输入两个整数xi,yi,表示第 i 名士兵帐篷的坐标。

Output

请输出一个整数,表示所有士兵从帐内移动到将要站队的位置的距离和。

Hint

站成一排的意思是最终队列中士兵们的纵坐标相同,横坐标排成连续的一段区间。

答案可能会超过int范围,使用printf输出64整数请使用%lld

思路

先y后x。对于y,寻找中位数,求出差值之和。对于x,先排序,更改元素后再排一次,之后同y。

注意:1、使用函数可大大降低难度(qsort很好用  2、注意输出格式,题目中已经提醒了

代码

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
long long ansx  =0,ansy = 0; 
int arrx [100010] = {0};
int arry [100010] = {0};
int comint(const void*el1,const void*el2)
{
	return *(int*)el1-*(int*)el2;
}

int main()
{
	int num = 0;  int i = 0;  int x = 0,y = 0;
	scanf("%d/n",&num);//输入 
	for(i = 0; i < num; i++)
	{
		scanf("%d %d",&arrx[i],&arry[i]);	
	}
	
	qsort(arry,num,sizeof(arry[0]),comint);//算y 
	y=num/2;   y=arry[y];
	for(i = 0; i < num; i++)
	{
		ans y+= abs(arry[i]-y);
	}
	
	qsort(arrx,num,sizeof(arrx[0]),comint);//算x
	for(i = 0; i < num; i++)
	{
		arrx[i] -= i;
	}
	qsort(arrx,num,sizeof(arrx[0]),comint);
	x=num/2;   	x=arrx[x];
	for(i = 0; i < num; i++)
	{
		ansx += abs(arrx[i]-x);
	}
	ansx += ansy;
	printf("%lld\n",ansx);
	
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值