lixu123 @ 2016-05-07 21:59:19
program Project1;
var
s,t:string;
l:char;
i,k:longint;
begin
readln(s);
t:=s;
for i:=1 to length(s)-1 do
begin
readln(s);
t:=t+s;
end;
write(length(s),' ');
l:='0';
for i:=1 to length(t) do
begin
if t[i]=l then inc(k)
else
begin
if l='1' then l:='0'
else l:='1';
write(k,' ');
k:=1;
end;
end;
write(k);
readln;
readln;
end.
by wzx20061006 @ 2017-02-04 20:32:19
s,t是ansistring类型的
by ljc20020730 @ 2017-02-06 14:54:21
看了下,现在的pascal题解太简单。我来一发详细的
给pascal党送点福利~~
友链:压缩技术(非续集版)
这一题输入是毫无头绪的。所以我们要先输入一个字符串,就知道N的值,然后再把后面的输入
注意把各行的字符串合并成大字符串时,大字符串的最大长度可能达到200^2 所以string是远远不够的,用ansistring否则40分
所以就有了这一段代码:
var n,i,ans:longint;
s,th:ansistring;
begin
readln(th);
s:=th;
n:=length(th);
for i:=1 to n-1 do begin
readln(th);
s:=s+th;
end;
write(n,' ');
i:=2;
s:=s+' ';
while i<=length(s)-1 do begin
ans:=1;
while (s[i]=s[i-1])and(i<=length(s)-1) do
begin inc(i);inc(ans); end;
inc(i);
write(ans,' ');
end;
writeln;
end.
先不要急着抄代码,本代码是只有20分的 给大家思考一下,为什么?
看一下这组数据:
11111
00100
11111
00100
11111
5 0 5 2 1 2 5 2 1 2 5
有没有发现,运行上述代码时输出5 5 2 1 2 5 2 1 2 5 ?
所以在此我们有一个地方要特殊处理:如果第一行第一个数据是1而不是0的话先打一个0否则20分
修改后程序如下:
var n,i,ans:longint;
s,th:ansistring;
begin
readln(th);
s:=th;
n:=length(th);
for i:=1 to n-1 do begin
readln(th);
s:=s+th;
end;
write(n,' ');
i:=2;
s:=s+' ';
if s[1]='1'then write(0,' ');
while i<=length(s)-1 do begin
ans:=1;
while (s[i]=s[i-1])and(i<=length(s)-1) do
begin inc(i);inc(ans); end;
inc(i);
write(ans,' ');
end;
writeln;
end.
当然,这段程序还有个BUG(虽然在洛谷上AC了) 建议加入最后一个数据是0的数据:
11111
00100
11111
00100
11110
5 0 5 2 1 2 5 2 1 2 5 1
上述程序依然无法打出最后一个1
所以在while 循环中又要加特判:
献上我自认为完美的代码:
var n,i,ans:longint;
s,th:ansistring;
begin
readln(th);
s:=th;
n:=length(th);
for i:=1 to n-1 do begin
readln(th);
s:=s+th;
end;
write(n,' ');
i:=2;//从第二个数据开始循环否则在while循环会爆201
s:=s+' ';//让大字符串最后多一个空格,否则在while循环会爆201
if s[1]='1'then write(0,' ');//特判如果第一行第一个数据是1而不是0的话先打一个0否则20分
while i<=length(s)-1 do begin
ans:=1;//即使有单独数字出现至少有1个
while (s[i]=s[i-1])and(i<=length(s)-1) do//如果相邻两个数据相同
begin inc(i);inc(ans); end;
inc(i);
write(ans,' ');
if (i=length(s))and((s[length(s)-1]='0')or(s[length(s)-1]='1'))and(s[i]<>s[i-1])
//特判,最后一个有效数字是单独一个出现,则打印1
then write('1 ');
end;
writeln;
end.
by ljc20020730
在题解发布前请勿转载