BZOJ 1034 [ZJOI2008]泡泡堂BNB

【题解】

  贪心。因为有平局的情况所以需要稍微思考,最普通的贪心是不可行的。我们可以构造一个这样的贪心策略:先把a,b排序,若a最弱的打得过b最弱的,那就打;否则,若a最强的打得过b最强的,那就打。否则就用a最弱的与b最强的对战,把自己的损失降到最小。

#include<cstdio>
#include<algorithm>
#define N 200010
#define rg register
using namespace std;
int n,a[N],b[N],a2[N],b2[N];
inline int read(){
	int k=0,f=1; char c=getchar();
	while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
	while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
	return k*f;
}
int main(){
	n=read(); 
	for(rg int i=1;i<=n;i++) a[i]=b2[i]=read();
	for(rg int i=1;i<=n;i++) b[i]=a2[i]=read();
	sort(a+1,a+1+n); sort(b+1,b+1+n);
	sort(a2+1,a2+1+n); sort(b2+1,b2+1+n);
	int la=1,lb=1,ra=n,rb=n,mx=0;
	while(la<=ra){
		if(a[la]>b[lb]) mx+=2,la++,lb++;
		else 
			if(a[ra]>b[rb]) mx+=2,ra--,rb--;
			else if(a[la++]==b[rb--]) mx++;
	}
	printf("%d ",mx);
	la=1,lb=1,ra=n,rb=n,mx=0;
	while(la<=ra){
		if(a2[la]>b2[lb]) mx+=2,la++,lb++;
		else 
			if(a2[ra]>b2[rb]) mx+=2,ra--,rb--;
			else if(a2[la++]==b2[rb--]) mx++;
	}
	printf("%d\n",n*2-mx);
	return 0;
}

  

posted @ 2018-02-26 20:21  Driver_Lao  阅读(127)  评论(0编辑  收藏  举报