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 }