牛客网暑期多校训练赛第二场 I题 (思维)
题意:
在N*N的格点上放置汽车,汽车只能放置在一条边上,汽车要驶到另一条边。规定两汽车相撞会损坏或者两个汽车在同一直线的驶向方向相同是不允许的。并且格点上会有M个障碍物,障碍物是提前放好的。问他最多能摆放多少辆汽车?
思路:
经过一些尝试可以发现N为奇数和偶数的汽车放置都是有规律的。
大胆猜测,在没有格子被破坏时,n为偶数,能放2n辆车,n为奇数时,最中间一行无论怎么放,都会相撞,所以能放2n-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;
}