讨论 / wish来看看
Wych 2009-05-02 03:48:00
点我顶贴 收藏 删除
题目编号:458-决斗

状态: Unaccepted

测评机: Xeost[5]

得分: 20分

提交日期: 2009-5-2 11:07:00

有效耗时: 234毫秒

测试结果1: 选手程序无输出

测试结果2: 测试结果错误.错误结果为:3

1

2

4

正确结果应为:4

1

2

4

5

测试结果3: 通过本测试点|有效耗时62ms

测试结果4: 测试结果错误.错误结果为:3

2

3

4

正确结果应为:4

2

3

4

5

测试结果5: 测试结果错误.错误结果为:5

1

2

3

4

6

正确结果应为:8

1

2

3

4

5

6

7

8

测试结果6: 输出过少|用户输出数据少于标准输出的50%[标准输出189位|选手输出16位]

测试结果7: 输出过少|用户输出数据少于标准输出的50%[标准输出185位|选手输出16位]

测试结果8: 输出过少|用户输出数据少于标准输出的50%[标准输出174位|选手输出10位]

测试结果9: 通过本测试点|有效耗时172ms

测试结果10: 输出过少|用户输出数据少于标准输出的50%[标准输出820位|选手输出13位]

提交代码:

program rq458wish(input,output);

var i,j,k,n :longint;

meet :array [1..1000,1..1000] of boolean;

beat :array [1..500,1..500] of boolean;

g :array [1..500] of longint;

begin

readln(n);

for i:=1 to n do

begin

for j:=1 to n do

begin

read(k);

if k=1 then

begin

beat[i,j]:=true;

beat[i+n,j]:=true;

beat[i,j+n]:=true;

beat[i+n,j+n]:=true;

end

else

begin

beat[i,j]:=false;

beat[i+n,j]:=false;

beat[i,j+n]:=false;

beat[i+n,j+n]:=false;

end;

end;

readln;

end;

for i:=1 to n*2 do

for j:=1 to n*2 do

meet[i,j]:=false;

for i:=1 to 2*n-1 do

meet[i,i+1]:=true;

for j:=2 to n do

for i:=1 to n do

for k:=i+1 to i+j-1 do

meet[i,i+j]:=meet[i,i+j] or ((meet[i,k] and meet[k,i+j]) and (beat[i,k] or not beat[k,i+j]));

j:=0;

for i:=1 to n do

if meet[i,i+n] then

begin

inc(j);

g[j]:=i;

end;

writeln(j);

for i:=1 to j-1 do

writeln(g[i]);

write(g[j]);

end.

为什么按照wish的标准题解不能AC呢?

#1 wish@2009-05-01 20:40:00
回复 删除
貌似dp循环的顺序有bug

应该按照 j-i 递增的顺序进行

#2 Wych@2009-05-01 21:03:00
回复 删除
没错呀

我定义的第一重循环j就是长度,且meet数组为[i,i+j],可为什么过不去呢?

#3 wish@2009-05-01 21:08:00
回复 删除
beat数组开小了吧...

还有 for j := 1 to n do 吧..

#4 Wych@2009-05-01 21:14:00
回复 删除
还是不对...
#5 wish@2009-05-01 21:27:00
回复 删除
貌似没错了。。
#6 Wych@2009-05-01 21:29:00
回复 删除
状态: Unaccepted

测评机: Xeost[5]

得分: 20分

提交日期: 2009-5-2 12:14:00

有效耗时: 234毫秒

测试结果1: 输出过少|用户输出数据少于标准输出的50%[标准输出2385位|选手输出22位]

测试结果2: 测试结果错误.错误结果为:3

1

2

4

正确结果应为:4

1

2

4

5

测试结果3: 通过本测试点|有效耗时62ms

测试结果4: 测试结果错误.错误结果为:3

2

3

4

正确结果应为:4

2

3

4

5

测试结果5: 测试结果错误.错误结果为:5

1

2

3

4

6

正确结果应为:8

1

2

3

4

5

6

7

8

测试结果6: 输出过少|用户输出数据少于标准输出的50%[标准输出189位|选手输出16位]

测试结果7: 输出过少|用户输出数据少于标准输出的50%[标准输出185位|选手输出16位]

测试结果8: 输出过少|用户输出数据少于标准输出的50%[标准输出174位|选手输出10位]

测试结果9: 通过本测试点|有效耗时172ms

测试结果10: 输出过少|用户输出数据少于标准输出的50%[标准输出820位|选手输出13位]

提交代码: program rq458wish(input,output);

var i,j,k,n :longint;

meet :array [1..10000,1..10000] of boolean;

beat :array [1..10000,1..10000] of boolean;

g :array [1..10000] of longint;

begin

readln(n);

for i:=1 to n do

begin

for j:=1 to n do

begin

read(k);

if k=1 then

begin

beat[i,j]:=true;

beat[i+n,j]:=true;

beat[i,j+n]:=true;

beat[i+n,j+n]:=true;

end

else

begin

beat[i,j]:=false;

beat[i+n,j]:=false;

beat[i,j+n]:=false;

beat[i+n,j+n]:=false;

end;

end;

readln;

end;

for i:=1 to n*2 do

for j:=1 to n*2 do

meet[i,j]:=false;

for i:=1 to 2*n-1 do

meet[i,i+1]:=true;

for j:=1 to n do

for i:=1 to n do

for k:=i+1 to i+j-1 do

meet[i,i+j]:=meet[i,i+j] or ((meet[i,k] and meet[k,i+j]) and (beat[i,k] or not beat[k,i+j]));

j:=0;

for i:=1 to n do

if meet[i,i+n] then

begin

inc(j);

g[j]:=i;

end;

writeln(j);

for i:=1 to j-1 do

writeln(g[i]);

write(g[j]);

end.

可是改过后还是诡异的20...

#7 wjh2008@2009-05-01 22:18:00
回复 删除
我开始也是这问题,循环少了...
#8 Wych@2009-05-01 22:20:00
回复 删除
???
#9 Mato完整版@2009-05-02 00:17:00
回复 删除
VAR

n, ss: LONGINT;

a, b: ARRAY[1..1000, 1..1000] OF BOOLEAN;

PROCEDURE init;

VAR

i, j, k: LONGINT;

BEGIN

READ(n);

FOR i:=1 TO n DO

FOR j:=1 TO n DO BEGIN

READ(k);

b[i, j] := (k = 1);

b[i + n, j] := (k = 1);

b[i, j + n] := (k = 1);

b[i + n, j + n] := (k = 1);

END;

INC(n, n);

FOR i:=1 TO n DO BEGIN

FOR j:=1 TO n DO WRITE(b[i, j], ’ ’);

WRITELN;

END;

END;

PROCEDURE xxx;

VAR

i, x, j, k: LONGINT;

BEGIN

FOR i:=1 TO n - 1 DO a[i, i + 1] := TRUE;

FOR x:=2 TO n DIV 2 DO

FOR i:=1 TO n - x DO BEGIN

j := i + x;

a[i, j] := FALSE;

FOR k:=i + 1 TO j - 1 DO

a[i, j] := a[i, j] OR (a[i, k] AND a[k, j] AND (b[i, k] OR (NOT b[k, j])));

END;

ss := 0;

FOR i:=1 TO n DIV 2 DO

IF a[i, i + n DIV 2] THEN INC(ss);

END;

PROCEDURE pri;

VAR

i: LONGINT;

BEGIN

WRITELN(ss);

FOR i:=1 TO n DIV 2 DO

IF a[i, i + n DIV 2] THEN WRITELN(i);

END;

BEGIN

init;

xxx;

pri;

END.

#10 Wych@2009-05-02 03:48:00
回复 删除

谢谢啦

原来i的循环要到2*n-j

明白啦,已AC

查看更多回复
提交回复