cf 1060d 思维贪心

题意:有N个人,你要让他们坐成若干个圆环。

  他们每个人需要坐一把椅子,左手边至少要有l个空椅子,右手边至少要有r个空椅子

  ,问最少需要多少个椅子。

参考:https://blog.csdn.net/zxyoi_dreamer/article/details/82941006

思路 :贪心

左走最大的那个人,他左边不可能有小于限制那么多的凳子,那么我们选择右走最大的那个人,使得他们左右重叠。这样的答案显然是最优的,如果这样贪心,我们总能够找出一个方案,交换两个位置,使它更优

 

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(v) v.begin(),v.end()

const int N = 1e5+4;
const int INF =1E9+4;
const ll mod =1e9+7;

ll powmod(ll x,ll n){
    ll res=1;while(n){if(n&1) res = res*x%mod; x=x*x%mod;n/=2;}return res;
}
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}

ll l[N],r[N];


int main(){
    int n;

    cin>>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]);

    cout<<ans<<endl;

    return 0;
}

 

posted on 2018-10-20 16:53  Helpp  阅读(156)  评论(0编辑  收藏  举报

导航