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

 

posted @ 2017-10-14 12:10  失忆的旅行者  阅读(152)  评论(0编辑  收藏  举报