牛客網暑期ACM多校訓練營(第二場)I-car
阿新 • • 發佈:2018-07-21
發現 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