码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces_D. Social Circles

时间:2018-10-06 13:20:47      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:i++   soc   序列   eof   cst   class   clu   依次   def   

http://codeforces.com/contest/1060/problem/D

题意:

n个客人,每个客人希望自己左边空li个座位,右边空ri个座位,可以形成任意个圆,问最少多少个座位。

思路:

1、问题可以看作,给每个客人gi的左边找一个合适的另一个客人gj。其之间的空座数为max(l(gi),r(gj))。这样匹配,自然会匹配为若干个圆。

2、将l和r排序,按大小顺利依次匹配,这样的总座位数最少。

证明:假设现在l和r都递增排好序。从匹配中任意找两对,例如(a, b),(c,d),且a!=c,b!=d,将其换为(c, b),(a, d)。

1)当c<=b时,已知a<c和b<d,得a<c<=b<d,交换后,max(a, b)==max(c, b)==b,max(c, d)==max(a, d)==d

2)当c>b时,

2.1)c<=d。得a<c,b<c,c<=d。max(a, b)<max(c, b),max(c, d)==max(a, d)

2.2)c>d。得b<d<c,a<c。max(c, d)==max(c, b),max(a, b) 不可能大于 max(a, d)

证得,交换l序列中任意两个不同得数,总座位数不会减少。

 

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long

int main()
{
    int n,l[100005],r[100005];
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d%d",&l[i],&r[i]);
        sort(l,l+n);
        sort(r,r+n);
        LL res=n;
        for(int i=0;i<n;i++)
            res+=max(l[i],r[i]);
        printf("%I64d\n",res);
    }
    return 0;
}

 

codeforces_D. Social Circles

标签:i++   soc   序列   eof   cst   class   clu   依次   def   

原文地址:https://www.cnblogs.com/jasonlixuetao/p/9746929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!