/**//* 题意: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
搜索
最新评论
|
|