enemy

来源:互联网 发布:淘宝怎么添加二级页面 编辑:程序博客网 时间:2024/05/21 23:33

Description

【引子】

会在何处见到你 莫非前尘已注定

飞过时空的距离 却囿于刀剑光影

三月春花渐次醒 迢迢年华谁老去

是劫是缘随我心 除了你万敌不侵

当恩怨各一半 我怎么圈揽

看灯笼血红染 寻仇已太晚

月下门童喟叹 昨夜太平长安

当天上星河转 我命已定盘

待绝笔墨痕干宿敌已来犯

我借你的孤单今生恐怕难还

——Vae《宿敌》



2014 年到了,T国和S 国在紧张交战中,现在到了最后一战。T国是一个实力很强的国家,在T国中,有一批为作战献身的机器人,对于任意一个机器人,有一个属性值pi,这个值越大,表示实力越强。T国将准备一支由n 个机器人组成的队伍,按照编号依次排开。

队伍准备就绪后,T 国的国王W 君发现这支队伍实在是不堪入目,他发现这些机器人的实力值参差不齐,W 君希望让这支队伍能在战场中发挥出最佳实力。

按照经验,当且仅当这n 个机器人的实力值为单调不增或单调不减时,我们称这样的n 个机器人组成的队伍为一个合格的队伍。于是W 君拿出编写机器人时的工具,准备对每个机器人的实力值进行修改。

其中,增加第i 个机器人的实力值,需要的费用为m1,减小第i 个机器人的实力值,需要的费用为m2,若不对第i 个机器人的实力值进行修改,则费用为0。无论实力值增加多少,费用均为m1,无论实力值减小多少,费用均为m2。

现在,给出n 个机器人的实力值,由于战争进行已久,T国的经费有限,请求出这个最小的修改代价,使得修改后的队伍成为一个合格的队伍。

注意:由于在制造机器人时的能力有限,对于n 个机器人,不同的实力值不会超过1,000个。

Input

输入文件共包含两行。

第一行共包括3 个正整数,分别为n,m1,m2。

第二行为n 个整数,第i 个整数表示第i 个机器人的实力值为pi。

Output

共一行,只有一个整数,为使得原队伍成为合格的队伍需要的最小修改代价。

Sample Input

5 1 11 3 2 2 1

Sample Output

1【样例说明】若将这个队伍改为单调不减的队伍,则至少需要对2 个机器人的实力值进行修改,费用为1×1+1×1=2,其中一种可行的方案是将第2 个机器人的实力值减小为2,将第5 个机器人的实力增加为3。而若将这个队伍改为单调不增的队伍,则只需将第1 个机器人的实力由1 增加为3 即可,费用为1×1=1。

Data Constraint



uses math;var        a,b,c,d,last,last1,i,j,k,k1,ans:longint;        v:array[0..50000,1..2]of longint;        r,r1:array[1..50000]of longint;        f:array[0..50000,1..1000]of longint;procedure ss(l,r:longint);var        i,j,mid:longint;begin        i:=l;        j:=r;        mid:=v[(i+j) div 2,1];        while i<j do        begin                while v[i,1]<mid do inc(i);                while v[j,1]>mid do dec(j);                if i<=j then                begin                        v[0]:=v[i];                        v[i]:=v[j];                        v[j]:=v[0];                        inc(i);                        dec(j);                end;        end;        if j>l then ss(l,j);        if i<r then ss(i,r);end;begin        assign(input,'enemy.in');reset(input);        assign(output,'enemy.out');rewrite(output);        readln(a,b,c);        if (a=2)or(a=1) then        begin                writeln(0);                halt;        end;        for d:=1 to a do        begin                read(v[d,1]);                v[d,2]:=d;        end;        ss(1,a);        for d:=1 to a do        begin                if v[d,1]<>last then                begin                        inc(last1);                        last:=v[d,1];                end;                r[v[d,2]]:=last1;        end;        fillchar(f,sizeof(f),0);        for i:=1 to a do        begin                k:=maxlongint;                for j:=1 to last1 do                begin                        k:=min(k,f[i-1,j]);                        if r[i]>j then f[i,j]:=k+c;                        if r[i]<j then f[i,j]:=k+b;                        if r[i]=j then f[i,j]:=k;                end;        end;        ans:=maxlongint;        for i:=1 to last1 do ans:=min(ans,f[a,i]);        for i:=1 to a do r1[i]:=r[a-i+1];        fillchar(f,sizeof(f),0);        for i:=1 to a do        begin                k:=maxlongint;                for j:=1 to last1 do                begin                        k:=min(k,f[i-1,j]);                        if r1[i]>j then f[i,j]:=k+c;                        if r1[i]<j then f[i,j]:=k+b;                        if r1[i]=j then f[i,j]:=k;                end;        end;        for i:=1 to last1 do ans:=min(ans,f[a,i]);        writeln(ans);        close(input);        close(output);end.

0 0
原创粉丝点击