题目描述 Description
给定平面上n个OIer和n台电脑,每个OIer只能水平向右和竖直向下,找到一台电脑写代码,其花费为OIer与电脑之间的曼哈顿距离(|x_i-x_j|+|y_i-y_j|)。
求出使n个OIer均找到自己电脑的最小花费。
输入输出格式 Input/output
输入格式:
输入第1行有一个整数n,表示点的个数。
接下来有n行,第i行包括两个用空格隔开的整数x_i,y_i,表示第i个OIer的位置;
接下来有n行,第i行包括两个用空格隔开的整数x_i,y_i,表示第i台电脑的位置。
输出格式:
输出1个整数,表示最小花费。
输入输出样例 Sample input/output
样例测试点#1 输入样例:
2
1 2
1 3
2 2
2 3
输出样例:
2
说明 description
对于样例,第一个OIer寻找到第一台电脑,第二个OIer寻找到第二台电脑。
最小花费为|2-1|+|2-2|+|2-1|+|3-3|=2。
对于30%的数据,保证2≤n≤50;
对于60%的数据,保证2≤n≤10^3;
对于100%的数据,保证2≤n≤5×10^4,0≤x_i≤100000,0≤y_i≤100000。
对于100%的数据,保证一定有解。
解题思路
这个题是水水的~但是看清题目是关键。题目中保证题目一定有解而且OIer只能向右或者向下走。用a【i】表示OIer的位置,b【i】表示电脑的位置。那么(b【i】.x-a【i】.x )>=0
且(a【i】.y-b【i】.y)>=0。。。什么鬼曼哈顿距离,什么鬼最小距离,都是唬人的好不好!。。。。边读入边计算即可解决此问题
代码
var i,n,a,b:longint;
ans:int64;
begin
readln(n);
for i:=1 to n do
begin
readln(a,b);
ans:=ans-a+b;
end;
for i:=1 to n do
begin
readln(a,b);
ans:=ans+a-b;
end;
write(ans);
end.
评测结果 Result
测试点 #1:通过该测试点。 得分10,耗时0ms,内存3108kB。
测试点 #2:通过该测试点。 得分10,耗时0ms,内存3108kB。
测试点 #3:通过该测试点。 得分10,耗时0ms,内存3096kB。
测试点 #4:通过该测试点。 得分10,耗时0ms,内存3108kB。
测试点 #5:通过该测试点。 得分10,耗时31ms,内存3137kB。
测试点 #6:通过该测试点。 得分10,耗时15ms,内存3133kB。
测试点 #7:通过该测试点。 得分10,耗时15ms,内存3133kB。
测试点 #8:通过该测试点。 得分10,耗时62ms,内存3133kB。
测试点 #9:通过该测试点。 得分10,耗时46ms,内存3137kB。
测试点 #10:通过该测试点。 得分10,耗时31ms,内存3133kB。