1. 程式人生 > >Codeforces 1060D Nature Reserve

Codeforces 1060D Nature Reserve

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);
}