题意:
给出一个矩阵,已知若干点是坏的, 安排座位,两两不能相邻。询问座位可以容纳最多或者最少的人。
思路:
最多的话就从边上开始占 X.X 最少的话就.X.
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
int mp[1005][1005];
int main()
{
int t;
scanf("%d",&t);
int n,m;
for(int cs=1; cs<=t; cs++)
{
scanf("%d%d",&n,&m);
memset(mp,0,sizeof mp);
int k;
scanf("%d",&k);
while(k--)
{
int x,y;
scanf("%d%d",&x,&y);
x++, y++;
mp[x][y]=1;
}
int num=0;
int maxx=0,minn=0;
for(int i=1;i<=n;i++)
{
num=0;
for(int j=1;j<=m;j++)
{
if(mp[i][j]==1)
{
maxx+=num/3+(!(num%3==0));
num=0;
}
else num++;
}
maxx+=num/3+(num%3!=0);
}
for(int i=1;i<=n;i++)
{
num=0;
for(int j=1;j<=m;j++)
{
if(mp[i][j]==1)
{
minn+=num/2+(num%2!=0);
num = 0;
}
else num++;
}
minn+=num/2+(num%2!=0);
}
printf("Case #%d: ",cs);
printf("%d %d\n",minn,maxx);
}
return 0;
}