Description:
FJ居住的城堡有N个城墙(1<=N<=25,000),编号为1到N,每个城墙的高度为M_i(1<=M_i<=100,000),他想把城墙的高度按照某种顺序变成B_1,B_2,….B_N(1<=B_i<=100,000),由于工作量比较大,FJ雇佣了一些牛来帮忙提高或降低墙的高度,当然要付工资,提高一单位高度需要花费X(1<=X<=100),降低一单位高度需要花费Y(1<=Y<=100)。
FJ想用最少的钱来完成这项任务,请你帮助计算,保证答案在longint范围内。
Input
第1行:3个空格隔开的整数N,X和Y
第2到N+1行:第i+1行包含两个空格隔开的整数表示M_i和B_i
Output
输出一个整数表示最少花费。
Solution
将M与B排序,之后直接对应计算ANS。
Program
type
QS=array [1..25000] of longint;
var
n,x,y,i,j:longint;
ans:int64;
m,b:QS;
procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;
x:=y;
y:=t;
end;
procedure Qsort(var d:QS;i,j:longint);
procedure sort(l,r:longint);
var
m,i,j:longint;
begin
i:=l;
j:=r;
m:=d[(i+j) shr 1];
repeat
while d[i]<m do
inc(i);
while m<d[j] do
dec(j);
if i<=j then
begin
swap(d[i],d[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then
sort(i,r);
if l<j then
sort(l,j);
end;
begin
sort(i,j);
end;
begin
assign(input,'sandcas.in');
assign(output,'sandcas.out');
reset(input);
rewrite(output);
readln(n,x,y);
for i:=1 to n do
readln(m[i],b[i]);
Qsort(m,1,n);
Qsort(b,1,n);
for i:=1 to n do
if m[i]>b[i] then
ans:=ans+(m[i]-b[i])*y
else
ans:=ans+(b[i]-m[i])*x;
writeln(ans);
close(input);
close(output);
end.