Codeforces 1060D Nature Reserve
阿新 • • 發佈:2018-12-24
Codefoces 1060D 思維題
大概題意:排環狀座位,可以有多個環,每個人對自己的座位都有如下要求:左邊需要有空位置a個,右邊需要有空位置b個,問最少需要座位多少個
首先我想到了貪心,兩個人的空座位互相重疊會導致結果最少,但是之後我開始糾結於每個人如何與其他人排位置才能導致最優解。
其實,我們只需要考慮左右兩旁空座位的數量,每一個左邊座位都要與一個右邊座位重疊,並且重疊後的數量是這兩個值的較大值。因此,我們只需要將l[] r[]從小到大排序,每次去max(l[i], r[i])即可
#include<bits/stdc++.h> #define pb push_back #define MID(a,b) ((a+b)>>1) #define LL(a) (a<<1) #define RR(a) (a<<1|1) using namespace std; typedef long long ll; typedef pair<int, int>pii; typedef pair<double, int> pdi; typedef pair<ll,int>pli; typedef pair<ll,ll>pll; typedef pair<string,int>psi; const int N = 1e5+5,M=100005; const int inf=0x3f3f3f3f; const ll INF=1000000000000000000ll; const ll mod = 998244353; const double pi=acos(-1.0); const double eps=1e-6; ll l[N], r[N]; int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld%lld", &l[i], &r[i]); } sort(l+1,l+1+n); sort(r+1,r+1+n); ll ans = n; for(int i=1;i<=n;i++){ ans += max(l[i], r[i]); } printf("%lld\n", ans); }