题目链接:https://www.nowcoder.com/acm/contest/140/I
题意:
在N*N的格点上放置汽车,汽车只能放置在一条边上,汽车要驶到另一条边。规定两汽车相撞会损坏或者两个汽车在同一直线的驶向方向相同是不允许的。并且格点上会有M个障碍物,障碍物是提前放好的。问他最多能摆放多少辆汽车?
思路:
经过一些尝试可以发现N为奇数和偶数的汽车放置都是有规律的。
如图:
按照这样的构造规律,可以发现当N为偶数的时候,可放置的汽车为2*N,而N为奇数的时候。可放置的汽车为2*N-1。
接下来我们讨论放置障碍物的情况。
我们可以发现奇数和偶数的情况唯一不同的是,奇数中会出现蓝色的这种情况导致在这上面的障碍物只会对一行或者一列的一辆车造成影响,而在其他的位置都会造成一行和一列两辆车的影响。
而蓝色的位置是不固定的,根据汽车放置的不同情况,特殊的蓝色情况也可以出现在黄色这条路上。
我们可以用两个数组分别记录下来行和列上车辆是否受到了影响。当这个障碍物已经使得该行或者该列影响,就把汽车数量减少,如果汽车出现在了奇数情况的中间十字的位置上,那么最后要加上这个办法会导致的多减去的一辆车数量。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[100005];
int b[100005];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int ans=2*n-n%2;
int f=0;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(n&1&&(x==n/2+1||y==n/2+1))
f=1;
if(a[x]==0)
{
ans--;
a[x]=1;
}
if(b[y]==0)
{
ans--;
b[y]=1;
}
}
ans+=f;
printf("%d\n",ans);
}
return 0;
}