bzoj 1034
类似田忌赛马问题。
设浙江队的实力值为a数组,对手的实力值为b数组。
先把两数组从小到大排序。
如果a中最小的一个比b中最小的一个大,那就让他们两个打。
如果a中最大的一个比b中最大的一个大,那就让他们两个打。
如果二者都不是就让a中最小的一个和b中最大的一个打,注意判断两者有可能是相等的。
第二问的答案就是n*2-对手的最优情况。
#include<cstdio> #include<cctype> #include<algorithm> using namespace std; int read(){ char c; while(!isdigit(c=getchar())); int x=c-'0'; while(isdigit(c=getchar())) x=x*10+c-'0'; return x; } int a[100001],b[100001]; int work(int a[],int b[],int n){ int l1=1,l2=1,r1=n,r2=n,ans=0; while(n--) if(a[l1]>b[l2]) l1++,l2++,ans+=2; else if(a[r1]>b[r2]) r1--,r2--,ans+=2; else if(a[l1]==b[r2]) l1++,r2--,ans+=1; else l1++,r2--; return ans; } int main(){ int n=read(); for(int i=1;i<=n;i+=1) a[i]=read(); for(int i=1;i<=n;i+=1) b[i]=read(); sort(a+1,a+n+1); sort(b+1,b+n+1); printf("%d %d",work(a,b,n),n*2-work(b,a,n)); return 0; }