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

来源:互联网 发布:美林数据股份有限公司 编辑:程序博客网 时间:2024/04/30 17:50

原题:

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