您的位置:首页 > 其它

字典序最小问题

2014-09-06 18:20 471 查看
给定长度为N的字符串S(只包含大写英文字母),要构造一个长度为N的字符串T。起初,T是一个空串,随后反复进行下列任意操作。

从S的头部删除一个字符,加到T的尾部 ;

从S的尾部删除一个字符,加到T的尾部。

目标是要构造字典序尽可能小的字符串T

输入:

第一行一个正整数N;

后面N行,每行一个大写字母。

输出:

T(输出时每行写满80个字符就换行)

样例输入:

6
A
C
D
B
C
B
样例输出:

ABCBCD

限制条件:

1≤N≤2000

字符串S只包含大写英文字母

解释:字典序是指从前到后比较两个字符串的大小的方法。首先比较第一个字符,如果不同则第一个字符较小的字符串更小,如果相同则继续比较第2个字符......如此继续,来比较整个字符串的大小。

分析:贪心

将字符串正序和反序比较,每次将较小串的首字母加到T的末尾!

var
n:integer;
t,s1,s2:ansistring;
ch:char;
procedure init;
var i:integer;
begin
readln(n);
s1:='';s2:='';
for i:=1 to n do
begin
readln(ch);
s1:=s1+ch;
s2:=ch+s2;
end;
end;
procedure main;
var i:integer;
begin
for i:=1 to n do
if s1<s2 then
begin
t:=t+s1[1];
delete(s1,1,1);
delete(s2,n-i+1,1);
end
else
begin
t:=t+s2[1];
delete(s1,n-i+1,1);
delete(s2,1,1);
end;
end;
procedure print;
var i:integer;
begin
for i:=1 to n do
begin
write(t[i]);
if i mod 80 =0 then writeln;
end;
end;
begin
init;
main;
PRINT;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: