June 11th 模拟赛C T1 Sandcas Solution

来源:互联网 发布:java如何比较日期大小 编辑:程序博客网 时间:2024/05/14 20:37

空降题目处
点我点我点我

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.
0 0
原创粉丝点击