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

 

posted @ 2017-10-23 18:08  或是七一  阅读(74)  评论(0编辑  收藏  举报