欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛客网第二场I--car(简单图论)

程序员文章站 2022-03-25 13:41:56
...

题目链接:传送门

题目大意:
你要在一个n*n的矩形的边界上*干辆车,所有车从同一时刻出发,以同样的速度,从某一列的一侧开到另一侧或者
从某一行的一侧开到另一侧。问最多放多少量车使得存在一种方式,这些车在行驶的过程中互不相撞。
(车可以视为质点)
同时还会有若干个格子被损坏车辆不能开进被损坏的格子。

牛客网第二场I--car(简单图论)

题目思路:

先考虑所有格子全部完好的情况。
通过爆搜/脑洞,发现答案就是2n-(n mod 2)

如何证明?
首先,一行一列最多只能放一辆车,同时如果n为奇数,则第(n+1)/2行和第(n+1)/2列不能都放车,所以刚刚
那个值是答案的上界。
同时我们也可以很容易地构造一组满足这个解的方案,得证。
有格子损坏时的情况也不难处理,就把那些行列去掉就好了。

#include<bits/stdc++.h>
using namespace std;
const int maxn =100000+100;
int vis1[maxn],vis2[maxn];
int main()
{
     int n,m;

     while(~scanf("%d%d",&n,&m))
     {
        memset(vis1,0,sizeof vis1);
        memset(vis2,0,sizeof vis2);
        int ans=2*n;
        for(int i=0;i<m;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(!vis1[x]){vis1[x]=1;ans--;}
            if(!vis2[y]){vis2[y]=1;ans--;}
        }
        if(n%2)
        {
            if(vis1[(n+1)/2]==0&&vis2[(n+1)/2]==0)ans--;
        }
        printf("%d\n",ans);
     }
}

 

相关标签: 图论