 /**//*
题意:N轮,每一轮给出A,给出B,回答每一轮(Ai + Bj)的最大值的最小
N <= 10^5 1 <= Ai,Bi <= 100
贪心的性质,让A的最大值跟B的最小值匹配
原因:
1)若Amax + Bmin 就是答案了,则不用拆开,拆开了得不到更优的
2)若Amax + Bmin 不是答案,设最大的 Ax + By,若拆开,则匹配为Amax + By, Ax + Bmin
显然Amax + By > Amax + Bmin 不会更优,所以不能拆开
好了,这就表明,A的大的要匹配B的小的,然后答案就是所有匹配的最大值了
但是 N <= 10^5 ,即使不用排序,找最大值也是N,O(N^5)过不了!!

但 1 <= Ai,Bi <= 100 ,统计A,B在区间[1,100]出现的个数即可!!
复杂度的降为 O(100N)!!
*/
#include<cstdio>
#include<cstring>

const int MAXN = 101;

 inline int min(int a,int b) {return a<b?a:b;}
 inline int max(int a,int b) {return a>b?a:b;}

int a[MAXN],b[MAXN];
int ca[MAXN],cb[MAXN];

int main()
  {
freopen("in","r",stdin);
//freopen("out","w",stdout);

int n,x,y;
while( ~scanf("%d",&n) )
 {
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
 {
scanf("%d%d",&x,&y);
a[x]++;
b[y]++;
for(int i=1;i<=100;i++)
 {
ca[i] = a[i];
cb[i] = b[i];
}
int ans = 0;
int ap = 100,bp = 1;
while( ap > 0 && bp < 101 )//复杂度降为了100!!!
 {
while( ap > 0 && !ca[ap] ) ap--;
while( bp < 101 && !cb[bp] ) bp++;

if( ap == 0 || bp == 101 ) break;

if( ans < ap + bp ) ans = ap + bp;
if ( ca[ap] > cb[bp] )
 {
ca[ap] -= cb[bp];
cb[bp] = 0;
}
 else {
cb[bp] -= ca[ap];
ca[ap] = 0;
}
}
printf("%d\n",ans);
}
}
return 0;
}
|
|
常用链接
随笔分类
Links
搜索
最新评论

|
|