2017.1.13【初中部 GDKOI】模拟赛B组 天黑黑 题解

原题:

http://172.16.0.132/senior/#contest/show/1894/2

题目描述:

我走在每天必须面对的分岔路/我怀念过去单纯美好的小幸福/爱总是让人哭/让人觉得不满足/天空很大却看不清楚/好孤独/天黑的时候/我又想起那首歌/突然期待下起安静的雨/原来外婆的道理早就唱给我听/下起雨/也要勇敢前行/我相信/一切都会平息/我现在好想回家去/天黑黑/欲落雨/天黑黑/黑黑
当整个世界陷入黑暗的时候,身为光明之神的Zyh想要用自己的若干个能量源和若干个集流器将这些能量源并成一个最大的能量源,这样他就可以造出最大的灯来照亮整个世界。
具体地来说每个能量源可以直接给出Ei的能量。而每个集流器是由两个接受端口和一个输出端口组成的。集流器有两种:A类和B类。A类是叠加集流器,可以将两个接收端口的能量叠加并输出。B类是取代集流器,可以将两个接受端口的能量较大那个输出。
现在有n-1个集流器,n个能量源。Zyh给出了集流器的连接方式,他想知道怎样放置能量源,能够使最后的输出最大化。

输入:

第一行是一个字符串,表示连接的方式。给出的形式是这样的:X,表示一个单独的输出能量源的放置处;AS1S2,其中S1和S2表示两个输出能量,A表示使用叠加集流器将能量并成一个,然后这本身也成为一个新的输出能源;BS1S2也是同理,只不过是使用取代集流器。并且保证A和B的个数为n-1个。X的个数为n个。
第二行是n个正整数,表示这几个能量源。

输出:

一个数,表示最大的输出能源。

样例输入:

输入1:
BXBXX
8 2 3
输入2:
AXBXX
8 2 3

样例输出:

输出1:
8
输入2:
11

数据范围限制:

对于20%的数据 n<10
对于60%的数据 n<=3000
对于100%的数据 n<=200000 Ei<=10000

提示:

这里写图片描述

分析:

我们发现A类集流器是不会造成能源个数的损失的,然后B类的话只会造成其一端的能源个数损失。然而我们只要知道能源的最大个数,然后从高到低填上去就行了并且读入的时候用个栈读入;
即:
这里写图片描述
这里写图片描述

实现:

var
        s:ansistring;
        i,t,n,ans:longint;
        a:array[0..200000]of longint;
        z:array[0..200000]of ansistring;
procedure q(x,y:longint);
var
        i,j,mid:longint;
begin
        i:=x;
        j:=y;
        mid:=a[x];
        repeat
                while a[j]<mid do dec(j);
                while a[i]>mid do inc(i);
                if i<=j then
                begin
                        a[0]:=a[i];
                        a[i]:=a[j];
                        a[j]:=a[0];
                        inc(i);
                        dec(j);
                end;
        until i>j;
        if x<j then q(x,j);
        if i<y then q(i,y);
end;
begin
        readln(s);
        for i:=length(s) downto 1 do
        begin
                if s[i]='B' then
                begin
                        if z[t]>z[t-1] then z[t-1]:=z[t];
                        z[t]:='';
                        dec(t);
                end
                else
                        if s[i]='A' then
                        begin
                                z[t-1]:=z[t-1]+z[t];
                                z[t]:='';
                                dec(t);
                        end
                        else
                        begin
                                inc(t);
                                z[t]:=s[i];
                        end;
        end;
        n:=(length(s)+1)div 2;
        for i:=1 to n do read(a[i]);
        q(1,n);
        for i:=1 to length(z[1]) do inc(ans,a[i]);
        writeln(ans);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值