大神来看看40分

P1320 压缩技术(续集版)

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

input

output

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

input

output

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

在题解发布前请勿转载


|