Hướng dẫn giải của NERED


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của happyboy99x

#include<cstdio>
#include<algorithm>
using namespace std;

const int N = 100 + 5;
int a[N][N], n, m, f[N][N];

int main() {
    scanf("%d%d",&n,&m);
    for(int i = 0, x, y; i < m; ++i) scanf("%d%d", &x, &y), a[x][y] = 1;
    for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j)
        f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + a[i][j];
    int res = m;
    for(int w = 1; w <= n; ++w) if(m % w == 0) {
        int h = m / w;
        for(int x = w; x <= n; ++x) for(int y = h; y <= n; ++y)
            res = min(res, m - (f[x][y] - f[x-w][y] - f[x][y-h] + f[x-w][y-h]));
    }
    printf("%d\n", res);
    return 0;
}

Code mẫu của ladpro98

program mnered;
uses    math;
const   maxn=101;
        fi='';
var     s,a:array[0..maxn,0..maxn] of longint;
        n,res,m:longint;

procedure input;
var     inp:text;
        i,x,y:longint;
begin
        assign(inp,fi);reset(inp);
        readln(inp,n,m);
        for i:=1 to m do
        begin
                readln(inp,x,y);
                a[x,y]:=1;
        end;
        close(inp);
end;

procedure init;
var     i,j:longint;
begin
        for i:=1 to n do
        for j:=1 to n do
        s[i,j]:=s[i,j-1]+s[i-1,j]-s[i-1,j-1]+a[i,j];
end;

function get(x,y,u,v:longint):longint;
begin
        exit(s[u,v]-s[x-1,v]-s[u,y-1]+s[x-1,y-1]);
end;

procedure work(p,q:longint);
var     i,j:longint;
begin
        for i:=p to n do
        for j:=q to n do
        res:=min(res,m-get(i-p+1,j-q+1,i,j));
end;

procedure process;
var     i:longint;
begin
        res:=high(longint);
        for i:=1 to trunc(sqrt(m)) do
        begin
                if m mod i = 0 then
                begin
                        work(i,m div i);
                        work(m div i,i);
                end;
        end;
end;

begin
        input;
        init;
        process;
        write(res);
end.

Code mẫu của RR

//Written by Nguyen Thanh Trung
{$R+,Q+}
{$Mode objFPC}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=111;
var
  n,m:longint;
  sum,a:array[-1..MAXN,-1..MAXN] of longint;
  f1,f2:text;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1);
  close(f2);
end;
procedure inp;
var
  u,v:longint;
begin
  read(f1,n,m);
  for m:=1 to m do
    begin
      read(f1,u,v);
      a[u,v]:=1;
    end;
end;
procedure solve;
var
  i,j,u1,v1,u2,v2,l,kq:longint;
begin
  for i:=1 to n do
  for j:=1 to n do
    sum[i,j]:=sum[i-1,j]+sum[i,j-1]-sum[i-1,j-1]+a[i,j];
  kq:=m;
  for u1:=1 to n do
  for v1:=1 to n do
    for l:=0 to n-u1 do
      begin
        u2:=u1+l;
        if m mod (u2-u1+1)<>0 then continue;
        v2:=v1+m div (u2-u1+1)-1;
        if v2>n then continue;
        kq:=min(kq,m-(sum[u2,v2]-sum[u1-1,v2]-sum[u2,v1-1]+sum[u1-1,v1-1]));
      end;
  writeln(f2,kq);
end;
begin
  openF;
  inp;
  solve;
  closeF;
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
main()
{
long n,m,ax[10001],ay[10001],free[101][101],u,v;
//freopen("MNERED2.inp","r",stdin);
scanf("%ld %ld",&n,&m);
for(long i=1;i<=n;i++)
  for(long j=1;j<=n;j++)
    free[i][j]=0;
long t=0;    
for(long i=1;i<=m;i++)
  {
  scanf("%ld %ld",&u,&v);
  if(free[u][v]==0)
    {
    t++;
    ax[t]=u;
    ay[t]=v;
    free[u][v]=1;
    }
  }
long max=0;  
for(long i=1;i<=m;i++)
  {
  if(m%i!=0)
    continue;
  else if(i>n||m/i>n)
    continue;
  else
    {
    long u=m/i;         
    long f[101][101],tinh;
    for(long j=1;j<=n;j++)
      for(long k=1;k<=n;k++)  
         f[j][k]=0;
    for(long j=1;j<=t;j++)
      {
      if(ax[j]<=i&&ax[j]+i-1>=n)
        for(long k=1;k<=n-i+1;k++)
          f[k][ay[j]]++;
      else if(ax[j]<=i)
        for(long k=1;k<=ax[j];k++)
          f[k][ay[j]]++;
      else if(ax[j]+i-1>=n)
        for(long k=ax[j]-i+1;k<=n-i+1;k++)
          f[k][ay[j]]++;
      else
        for(long k=ax[j]-i+1;k<=ax[j];k++)
          f[k][ay[j]]++;   
      }
    //for(long j=1;j<=n;j++)
      //for(long k=1;k<=n;k++)   
        //printf("%ld\n",f[j][k]);     
    for(long j=1;j<=n-i+1;j++)
      {
      tinh=0;
      for(long k=1;k<=u;k++)
        tinh=tinh+f[j][k];
      if(tinh>max)
        max=tinh;
      for(long k=2;k<=n-u+1;k++)
        {
        tinh=tinh+f[j][k+u-1]-f[j][k-1];
        if(tinh>max)
          max=tinh;
        }
      }    
    }
  }
printf("%ld",m-max);
//getch();
}

Code mẫu của ll931110

{$MODE DELPHI}
Program MNERED;
Const
  input  = '';
  output = '';
  maxn = 100;
Var
  a,br,b,tt: array[0..maxn,0..maxn] of integer;
  d: array[1..maxn] of integer;
  num,move: integer;
  n,m: integer;

Procedure init;
Var
  f: text;
  i,j,r,c: integer;
Begin
  Assign(f, input);
    Reset(f);

  Readln(f, n, m);
  Fillchar(a, sizeof(a), 0);

  For i:= 1 to m do
    Begin
      Readln(f, r, c);
      inc(a[r,c]);
    End;

  Close(f);

  Fillchar(b, sizeof(b), 0);
  For i:= 1 to n do
    For j:= 1 to n do
      If a[i,j] > 1 then b[i,j]:= a[i,j] - 1;
End;

Procedure gens;
Var
  i,j,tb,tp: integer;
Begin
  Fillchar(br, sizeof(br), 0);
  Fillchar(tt, sizeof(tt), 0);

  For i:= 1 to n do
    Begin
      tb:= 0;
      tp:= 0;

      For j:= 1 to n do
        Begin
          tb:= tb + b[i,j];
          br[i,j]:= br[i - 1,j] + tb;

          tp:= tp + a[i,j];
          tt[i,j]:= tt[i - 1,j] + tp;
        End;
    End;

  num:= 0;
  For i:= 1 to m do if m mod i = 0 then
    Begin
      inc(num);
      d[num]:= i;
    End;
End;

Procedure solve;
Var
  sx,sy,fx,fy: integer;
  i,tmp,mb,mt: integer;
Begin
  move:= maxn * maxn;
  For sx:= 1 to n do
    For sy:= 1 to n do
      For i:= 1 to num do
        Begin
          fx:= sx + d[i] - 1;
          fy:= sy + m div d[i] - 1;

          If (fx <= n) and (fy <= n) then
            Begin
              mb:= br[fx,fy] - br[sx - 1,fy] - br[fx,sy - 1] + br[sx - 1,sy - 1];
              mt:= m - (tt[fx,fy] - tt[sx - 1,fy] - tt[fx,sy - 1] + tt[sx - 1,sy - 1]);
              tmp:= mb + mt;
              If move > tmp then move:= tmp;
            End;
        End
End;

Procedure printresult;
Var
  f: text;
Begin
  Assign(f, output);
    Rewrite(f);
    Writeln(f, move);
  Close(f);
End;

Begin
  init;
  gens;
  solve;
  printresult;
End.

Code mẫu của skyvn97

#include<bits/stdc++.h>
#define MAX   111
int n,m;
int c[MAX][MAX];
int s[MAX][MAX];
void minimize(int &x,const int &y) {
    if (x>y) x=y;
}
void init(void) {
    scanf("%d",&n);
    scanf("%d",&m);
    int i,j,x,y;
    for (i=1;i<=m;i=i+1) {
        scanf("%d",&x);
        scanf("%d",&y);
        c[x][y]++;
    }
    for (i=1;i<=n;i=i+1)
        for (j=1;j<=n;j=j+1)
            s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+(c[i][j]>0);
}
int count(const int &x1,const int &y1,const int &x2,const int &y2) {
    return (s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]);
}
void process(void) {
    int res=m+1;
    int i,j,dx,dy;
    for (i=1;i<=n;i=i+1)
        for (j=1;(j<=n) && ((n-i+1)*(n-j+1)>=m);j=j+1)
            for (dx=1;dx<=n-i+1;dx=dx+1)
                if (m%dx==0 && m/dx<=n-j+1) {
                    dy=m/dx;
                    minimize(res,m-count(i,j,i+dx-1,j+dy-1));
                }
    printf("%d",res);
}
int main(void) {
    init();
    process();
    return 0;
}

Code mẫu của khuc_tuan

#include <iostream>
using namespace std;

int n, m;
int a[111][111], p[111][111];

int main() {
    scanf("%d%d", &n, &m);
    for(int i=0;i<m;++i) {
        int u, v;
        scanf("%d%d", &u, &v);
        a[u][v] = 1;
    }
    for(int i=1;i<=n;++i) 
        for(int j=1;j<=n;++j)
            p[i][j] = p[i-1][j] + a[i][j];
    int res = 0;
    for(int d1=1;d1<=n;++d1) {
        for(int d2=d1;d2<=n;++d2) if( m % (d2-d1+1) == 0) {
            int w = m / (d2-d1+1);
            for(int i=1, cur=0;i<=n;++i) {
                cur += p[d2][i] - p[d1-1][i];
                if(i>w) cur -= p[d2][i-w] - p[d1-1][i-w];
                if(i>=w) res >?= cur;
            }
        }
    }
    cout << m - res << endl;
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.