enemy

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 1


1 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值