在一个N*N的区域玩积木游戏,每个单元格正好跟积木的底面相等,每个单元格里放有若干个积木,Alice想重新摆放积木,使得每个单元格最多只能放一个积木,并且所有积木正好形成一个矩形。 把一个积木从一个位置移到另一个位置称为一次操作。 给出初始状态,编程计算最少需要多少次操作才能达到上述要求。 题解: 水水之后发现跟曾经做过的打砖块有点像,要先做了预处理,求出矩阵之间有几个积木。 代码 var s:array[0..100,0..100] of longint; n,m:longint; procedure init; var a,b,i:longint; begin readln(n,m); for i:=1 to m do begin readln(a,b); s[a,b]:=1; end; end; function ma(x,y:longint):longint; begin if x>y then exit(x) else exit(y); end; procedure tj; var i,j:longint; begin for i:=1 to n do for j:=1 to n do s[i,j]:=s[i,j]+s[i-1,j]+s[i,j-1]-s[i-1,j-1]; end; var i,j,k,max,ans:longint; begin init; tj; for i:=1 to n do begin max:=0; if m mod i=0 then for j:=i to n do for k:=m div i to n do max:=ma(s[j,k]-s[j-i,k]-s[j,k-m div i]+s[j-i,k-m div i],max); if max>ans then ans:=max; end; writeln(m-ans); end.