bzoj 1034
田忌赛马大家都知道吧,这题就是用了这个思想。
设浙江队的实力值为a数组,对手的实力值为b数组。
首先,把两个数组从小到大排序。
如果a中最小的一个比b中最小的一个大,那就让他们两个打。
如果a中最大的一个比b中最大的一个大,那就让他们两个打。
如果二者都不是就让a中最小的一个和b中最大的一个打,注意判断两者有可能是相等的。
而第二问的答案其实也就是n*2-对手的最优情况。
#include<cstdio> #include<cctype> #include<algorithm> using namespace std; const int maxn=100000; 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[maxn],b[maxn]; int main(){ int n=read(); for(int i=0;i<n;i+=1) a[i]=read(); for(int i=0;i<n;i+=1) b[i]=read(); sort(a,a+n); sort(b,b+n); int l1=0,l2=0,r1=n-1,r2=n-1,ans=0; for(int i=0;i<n;i+=1) if(a[l1]>b[l2]) ans+=2,l1++,l2++; else if(a[r1]>b[r2]) ans+=2,r1--,r2--; else{ if(a[l1]==b[r2]) ans+=1; l1++,r2--; } printf("%d",ans); for(int i=0;i<n;i+=1) swap(a[i],b[i]); l1=0,l2=0,r1=n-1,r2=n-1,ans=0; for(int i=0;i<n;i+=1) if(a[l1]>b[l2]) ans+=2,l1++,l2++; else if(a[r1]>b[r2]) ans+=2,r1--,r2--; else{ if(a[l1]==b[r2]) ans+=1; l1++,r2--; } printf(" %d",n*2-ans); return 0; }