83 条题解
-
0strini LV 8 @ 2009-09-19 17:09:01
编译通过...
├ 测试数据 01:答案正确... 572ms
├ 测试数据 02:答案正确... 541ms
├ 测试数据 03:答案正确... 525ms
├ 测试数据 04:答案正确... 478ms
├ 测试数据 05:答案正确... 494ms
├ 测试数据 06:答案正确... 509ms
├ 测试数据 07:答案正确... 494ms
├ 测试数据 08:答案正确... 494ms
├ 测试数据 09:答案正确... 478ms
├ 测试数据 10:答案正确... 462ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:5047ms现场生成一张40MB的表(二进制),然后比对。
-
02009-09-18 14:11:41@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms啊哈哈哈看完Matrix67大牛的位运算教程写这个东西就是快
大家可以看这里
http://www.matrix67.com/blog/archives/122把那个N皇后的例子看明白了这题就很弱智了
贴个小小的主过程
function pd:integer; //模拟判断剩下4行能否全亮并计算按开关的次数
var i,x,z,y,sum:integer;
begin
b:=a;
sum:=0;
for i:=1 to 4 do
begin
while b[i]5 then ans:=min(ans,pd+sum)
else
begin
work(i+1,sum);
x:=1 shl(i-1);
if i=1 then y:=3
else y:=(7 shl(i-2)) and 31;
a[1]:=a[1] xor y;
a[2]:=a[2] xor x;
work(i+1,sum+1);
a[1]:=a[1] xor y;
a[2]:=a[2] xor x;
end;
end; -
02009-09-15 15:16:26@
编译通过...
├ 测试数据 01:答案正确... 541ms
├ 测试数据 02:答案正确... 525ms
├ 测试数据 03:答案正确... 556ms
├ 测试数据 04:答案正确... 494ms
├ 测试数据 05:答案正确... 478ms
├ 测试数据 06:答案正确... 525ms
├ 测试数据 07:答案正确... 541ms
├ 测试数据 08:答案正确... 462ms
├ 测试数据 09:答案正确... 494ms
├ 测试数据 10:答案正确... 462ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:5078ms好恒定。。。。
-
02009-09-02 20:07:12@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-09-02 17:47:36@
反向DFS……
Debug一个下午…………
-
02009-09-02 08:14:46@
DFS加剪枝加位运算
const allone=33554431;
type
point=^node;
node=record
number,steps:longint;
next:point;
end;
var
bemod,min,i,j,n,k,t,g,code:longint;
hash:array[0..50000] of point;
c:char;function update(i:longint; now:longint):longint;
begin
now:=now xor 1 shl (i-1);
if ((i-1) mod 5)0 then now:=now xor (1 shl (i-2));
if ((i+1) mod 5)1 then now:=now xor (1 shl i);
if i5 then now:=now xor (1 shl (i-6));
update:=now;
end;procedure peset(d,step,now:longint);
var
ii, tt,i,j,previous:longint;
pp,p:point;
done:boolean;
begin
if step>7 then exit;pp:=hash[now mod bemod];
while pp^.nextnil do
begin
pp:=pp^.next;
if pp^.number=now then
begin
if step-1 -
02009-08-28 20:16:04@
编译通过...
├ 测试数据 01:答案正确... 9ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 9ms
├ 测试数据 07:答案正确... 9ms
├ 测试数据 08:答案正确... 9ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 9ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:45ms
写丑了,没MSvar i,j,xx,yy,n,k,ii,x:longint;
p:char;
ha,num,f:array[0..1000000]of longint;
function hash(x:longint):longint;
var j:longint;
begin
j:=x mod 1000000;
while (ha[j]-1)and(ha[j]x) do j:=(j+1)mod 1000000;
exit(j);
end;
begin
fillchar(ha,sizeof(ha),\(ff);
fillchar(num,sizeof(num),\)ff);
f[1]:=33554431;
ha[hash(33554431)]:=33554431;
num[hash(f[1])]:=0;
i:=0;
j:=1;
while ij do
begin
// if j>900000 then break;
i:=i+1;
while (num[hash(f[i])]>=6)and(ij then break;
{11000
10000
00000
00000
00000}
yy:=f[i] xor 25690112;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{11100
01000
00000
00000
00000}
yy:=f[i] xor 29622272 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{01110
00100
00000
00000
00000}
yy:=f[i] xor 14811136 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00111
00010
00000
00000
00000}
yy:=f[i] xor 7405568 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00011
00001
00000
00000
00000}
yy:=f[i] xor 3178496 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{10000
11000
10000
00000
00000}
yy:=f[i] xor 17580032 ;
if ha[hash(yy)]=-1 thenbegin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{01000
11100
01000
00000
00000}
yy:=f[i] xor 9314304 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00100
01110
00100
00000
00000}
yy:=f[i] xor 4657152 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00010
00111
00010
00000
00000}
yy:=f[i] xor 2328576 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00001
00011
00001
00000
00000}
yy:=f[i] xor 1147904 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
10000
11000
10000
00000}
yy:=f[i] xor 549376 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
01000
11100
01000
00000}
yy:=f[i] xor 291072 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00100
01110
00100
00000}
yy:=f[i] xor 145536 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00010
00111
00010
00000}
yy:=f[i] xor 72768 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00001
00011
00001
00000}
yy:=f[i] xor 35872 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
10000
11000
10000}
yy:=f[i] xor 17168 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
01000
11100
01000}
yy:=f[i] xor 9096 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
00100
01110
00100}
yy:=f[i] xor 4548 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
00010
00111
00010}
yy:=f[i] xor 2274 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
00001
00011
00001}
yy:=f[i] xor 1121 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
00000
10000
11000}
yy:=f[i] xor 536 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
00000
01000
11100}
yy:=f[i] xor 284 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
00000
00100
01110}
yy:=f[i] xor 142 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
00000
00010
00111}
yy:=f[i] xor 71 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
{00000
00000
00000
00001
00011}
yy:=f[i] xor 35 ;
if ha[hash(yy)]=-1 then
begin
j:=j+1;
ha[hash(yy)]:=yy;
num[hash(yy)]:=num[hash(f[i])]+1;
f[j]:=yy;
end;
end;
readln(n);for ii:=1 to n do
begin
x:=0;
for i:=5 downto 1 do
begin
for j:=5 downto 1 do
begin
read(p);
if p='1' then
begin
x:=x+1 shl ((i-1)*5+j-1)
end;
end;
readln;
end;
writeln(num[hash(x)]);
readln;
end;
end.
%>_ -
02009-08-26 16:20:32@
位运算果然厉害
-
02009-08-22 15:25:47@
反向搜索=AC
-
02009-08-12 14:42:38@
强大的位运算
-
02009-08-05 20:15:55@
如对本题有疑问可以参看我的题解:http://xujieqi.blog.hexun.com/35722312_d.html
-
02009-07-26 20:08:58@
用5重循环枚举第一行的操作......
然后再枚举以下5行的状态
多谢txx和hsh大牛的指教 -
02009-07-26 16:56:26@
多谢Matrix67大牛结题报告
-
02009-07-22 12:03:31@
XOR方程解,自由元枚举
-
02009-07-09 19:05:36@
编译通过...
├ 测试数据 01:答案正确... 56ms
├ 测试数据 02:答案正确... 56ms
├ 测试数据 03:答案正确... 72ms
├ 测试数据 04:答案正确... 134ms
├ 测试数据 05:答案正确... 72ms
├ 测试数据 06:答案正确... 56ms
├ 测试数据 07:答案正确... 88ms
├ 测试数据 08:答案正确... 72ms
├ 测试数据 09:答案正确... 88ms
├ 测试数据 10:答案正确... 41ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:735ms
真慢 -
02009-07-09 17:56:38@
program switch;
const bp=3214567;
type pointer=^rec;
rec=record
v:longint;
step:integer;
next:pointer;
end;
var total:longint;
hash:array[0..bp-1] of pointer;
q:array[1..400000] of rec;
i,j,k,n,m,l:integer;
p:pointer;
function find(a:longint; step:integer):boolean;
var now:pointer;
begin
now:=hash[a mod bp];
while now nil do
begin
if now^.v=a then exit(true);
now:=now^.next;
end;
new(now);
now^.v:=a;
now^.step:=step;
now^.next:=hash[a mod bp];
hash[a mod bp]:=now;
total:=total+1;
exit(false);
end;
function update(a:longint; p:integer):longint;
begin
a:=a xor (1 shl p);
if (p mod 5)0 then a:=a xor (1 shl (p-1));
if ((p+1) mod 5)0 then a:=a xor (1 shl (p+1));
if p4 then a:=a xor (1 shl (p-5));
exit(a);
end;
procedure run;
var head:longint=0;
open:longint=1;
p:integer;
begin
find((1 shl 25)-1,0);
q[1].v:=(1 shl 25)-1;
q[1].step:=0;
repeat
inc(head);
for p:=0 to 24 do
if ((not find(update(q[head].v,p),q[head].step+1)) and (q[head].step+1=open;
end;
begin
readln(n);
run;
for l:=1 to n do
begin
m:=0;
for i:=1 to 5 do
begin
for j:=1 to 5 do
begin
read(k);
m:=m*2+k*2;
end;
readln;
end;
if hash[m mod bp]=nil then writeln(-1)
else
begin
p:=hash[m mod bp];
while ((p^.nextnil) or (p^.v=m)) do
if p^.v=m then writeln(p^.step) else writeln(-1);
end;
end;
end. -
02009-07-01 19:18:44@
这题我们今年省选考的范围很大,要高斯消元。
我很弱,我不会 -
02009-06-29 20:55:24@
这道题目似乎可以用高斯消元吧。。。
-
02009-06-09 14:54:07@
强烈支持位运算!!!!!!!!!!
强烈支持matrix67!!!!!!!!!! -
02008-11-23 10:31:06@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
初识位运算,强极了,棒极了!