BZOJ1034 ZJOI2008 泡泡堂BNB 贪心

题意:给定两个数列a b,求两数列怎样排列能使a个数列中:2*(a[i]>b[i]的数量)+(a[i]=b[i]的数量)最大和最小。

题解:将两数组排序后,按如下流程贪心:(1)如果a最弱的人强于b最弱的人,两者相赛 (2)否则,如果a最强的人强于b最强的人呢,两者相赛 (3)否则,用a最弱的人与b最强的人相赛。而由于答案的最大值+最小值=2*N,所以别求一遍a b的最大答案即可。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 const int MAXN=100000+2;
 9 int N,a[MAXN],b[MAXN];
10 
11 int Slove(int *a,int *b){
12     int l1=1,l2=1,r1=N,r2=N,Ans=0;
13     while(l1<=r1 && l2<=r2)
14         if(a[l1]>b[l2]) l1++,l2++,Ans+=2;
15         else if(a[r1]>b[r2]) r1--,r2--,Ans+=2;
16         else if(a[l1]==b[r2]) l1++,r2--,Ans++;
17         else l1++,r2--;
18     return Ans;
19 }
20 
21 int main(){
22     cin >> N;
23     for(int i=1;i<=N;i++) scanf("%d",a+i);
24     for(int i=1;i<=N;i++) scanf("%d",b+i);
25     sort(a+1,a+N+1),sort(b+1,b+N+1);
26 
27     cout << Slove(a,b) << " " << 2*N-Slove(b,a) << endl;
28 
29     return 0;
30 }
View Code

 

posted @ 2017-02-25 21:45  WDZRMPCBIT  阅读(157)  评论(0编辑  收藏  举报