1. 程式人生 > >牛客網暑期ACM多校訓練營(第二場)I-car

牛客網暑期ACM多校訓練營(第二場)I-car

發現 namespace set n+1 http 方案 同時 如何 一行

題意:

你要在一個n*n的矩形的邊界上方若幹輛車,所有車從同一
時刻出發,以同樣的速度,從某一列的一側開到另一側或者
從某一行的一側開到另一側。問最多放多少量車使得存在一
種方式,這些車在行駛的過程中互不相撞。
(車可以視為質點)
同時還會有若幹個格子被損壞車輛不能開進被損壞的格子。

先考慮所有格子全部完好的情況。
通過爆搜/腦洞,發現答案就是2n-(n mod 2)。
如何證明?
首先,一行一列最多只能放一輛車,同時如果n為奇數,則第(n+1)/2行和第(n+1)/2列不能都放車,所以剛剛
那個值是答案的上界。
同時我們也可以很容易地構造一組滿足這個解的方案,得證。
有格子損壞時的情況也不難處理,就把那些行列去掉就好了。

技術分享圖片

代碼:

/*
這題一開始做的時候並沒有考慮好車子的分布
該矩陣可以把它分成四個小部分,分別對應相應的方向

*/

#include <bits/stdc++.h>

using namespace std;

const int maxn=1e5+10;

int n,m;
int x,y;
int s1[maxn],s2[maxn];

int main()
{
    cin>>n>>m;
    memset(s1,0,sizeof(s1));
    memset(s2,0,sizeof(s2));
    for(int i=0;i<m;i++)
    {
        cin
>>x>>y; s1[x]++; s2[y]++; } int ans=2*n-n%2; for(int i=1;i<=n;i++) { if(s1[i]) ans--; if(s2[i]) ans--; } if(n%2==1&&s1[(n+1)/2]==1&&s2[(n+1)/2]==1) ans++;///多減了一次 cout<<ans<<endl; return 0; }

牛客網暑期ACM多校訓練營(第二場)I-car