lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。
游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。
现在lxhgww想知道他最多能连续攻击boss多少次?
【解题报告】
去年省选用的数学方法。因为有两组反例与省队失之交臂。
废话少说,二分图匹配,左半集X为攻击,右半集Y为装备。时限2s。
1 program game;
2
3 type
4 node=^tnode;
5 tnode=record
6 data:longint;
7 next:node;
8 end;
9
10 var
11 p:node;
12 i,x,n,j:longint;
13 f:array[0..1000001]of node;
14 state:array[0..1000001]of boolean;
15 result:array[0..1000001]of longint;
16
17 procedure init;
18 begin
19 assign(input,'game.in');
20 reset(input);
21 assign(output,'game.out');
22 rewrite(output);
23 end;
24
25 procedure outit;
26 begin
27 close(input);
28 close(output);
29 halt;
30 end;
31
32 function find(x:longint):boolean;
33 var
34 p:node;
35 begin
36 p:=f[x];
37 while p<>nil do
38 begin
39 if not state[p^.data] then
40 begin
41 state[p^.data]:=true;
42 if (result[p^.data]=0)or(find(result[p^.data])) then
43 begin
44 result[p^.data]:=x;
45 exit(true);
46 end;
47 end;
48 p:=p^.next;
49 end;
50 exit(false);
51 end;
52
53 procedure main;
54 var
55 p:node;
56 begin
57 fillchar(f,sizeof(f),0);
58 fillchar(state,sizeof(state),0);
59 fillchar(result,sizeof(result),0);
60
61 readln(n);
62 for i:=1 to n do
63 for j:=0 to 1 do
64 begin
65 read(x);
66 new(p);
67 p^.data:=i;
68 p^.next:=f[x];
69 f[x]:=p;
70 end;
71
72 for i:=1 to n do
73 begin
74 fillchar(state,sizeof(state),0);
75 if not(find(i)) then
76 begin
77 writeln(i-1);
78 outit;
79 end;
80 end;
81 writeln(n);
82 end;
83
84 begin
85 init;
86 main;
87 outit;
88 end.
89
90