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; }