• 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;
    }
  • 相关阅读:
    oracel 复制A列的内容到列
    视图转为表
    面向对象
    银弹效应
    解决linux删除文件后空间没有释放问题
    HttpAnalyzerStdV7安装教程
    HttpUploader6.2-process版本
    Chrome浏览器控件安装方法
    Firefox浏览器控件安装方法
    通达OA整合教程
  • 原文地址:https://www.cnblogs.com/AmnesiacVisitor/p/7666349.html
Copyright © 2020-2023  润新知