积木游戏_纪中1440_暴力+预处理

55 篇文章 0 订阅
53 篇文章 0 订阅

Description

在一个N*N的区域玩积木游戏,每个单元格正好跟积木的底面相等,每个单元格里放有若干个积木,Alice想重新摆放积木,使得每个单元格最多只能放一个积木,并且所有积木正好形成一个矩形。

把一个积木从一个位置移到另一个位置称为一次操作。

给出初始状态,编程计算最少需要多少次操作才能达到上述要求。

Input

第一行包含两个整数N和M(1<=N<=100,1<=M<=N^2),表示区域大小以及积木的数量。

接下来M行,每行包含两个整数R和C(1<=R,C<=N),表示每个积木放置的位置。

Output

输出最少操作次数。输入保证有解。

解析

类似打砖块,预处理一下二维前缀和,找到一个包括最多积木的矩形与总数相减就是答案

源码

var
  n,m:longint;
  f:array[0..101,0..101]of longint;
function max(x,y:longint):longint;
begin
  max:=y;
  if x>y then
  max:=x;
end;
procedure main;
var
  i,j,k,l,ans:longint;
begin
  ans:=0;
  for i:=1 to m do
  if m mod i=0 then
  begin
    j:=m div i;
    if (i>n)or(j>n) then continue;
    for k:=i to n do
    for l:=j to n do
    ans:=max(f[k,l]-f[k-i,l]-f[k,l-j]+f[k-i,l-j],ans);
  end;
  writeln(m-ans);
end;
procedure init;
var
  i,j,x,y:longint;
begin
  readln(n,m);
  for i:=1 to m do
  begin
    readln(x,y);
    f[x,y]:=1;
  end;
  for i:=1 to n do
  for j:=1 to n do
  f[i,j]:=f[i-1,j]+f[i,j-1]-f[i-1,j-1]+f[i,j];
end;
begin
  init;
  main;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值