• 【OpenJ_Bailian


    拼点游戏

    Descriptions:

    C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌,每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌,S随机抽取n张蓝色卡牌,他们进行n回合拼点,每次两人各出一张卡牌,点数大者获得三颗巧克力,小者获得一颗巧克力,如果点数相同,每人各得二颗巧克力,使用过的卡牌不得重复使用。已知C和S取到的卡牌点数,请编程计算S最多和最少能得到多少颗巧克力。

    Input

    输入包含多组测试数据。 

    每组测试数据的第一行是一个整数n(1<=n<=1000),接下来一行是n个整数,表示C抽到的白色卡牌的点数,下一行也是n个整数,表示S抽到的蓝色卡牌的点数。 
    输入的最后以一个0表示结束

    Output

    对每组数据,输出一行,内容是两个整数用空格格开,分别表示S最多和最少可获得的巧克力数。

    Sample Input

    3
    92 83 71
    95 87 74
    2
    20 20
    20 20
    2
    20 19
    22 18
    0

    Sample Output

    9 5
    4 4
    4 4

    题目链接:

    https://vjudge.net/problem/OpenJ_Bailian-4005

    田忌赛马的加强版,参照田忌赛马,稍微改改就行

    田忌赛马链接:

    https://www.cnblogs.com/sky-stars/p/11073032.html

    AC代码

    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <algorithm>
    #include <cmath>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <cstring>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #define mod 1000000007
    #define eps 1e-6
    #define ll long long
    #define INF 0x3f3f3f3f
    #define ME0(x) memset(x,0,sizeof(x))
    using namespace std;
    int n;
    //这就是田忌赛马好吗0.0  不会的看我田忌赛马博客  讲的比较细
    //  https://www.cnblogs.com/sky-stars/p/11073032.html
    int solve(int c[1005],int s[1005])
    {
        int ans=0;
        int cl=1,cr=n,sl=1,sr=n;
        while(sl<=sr)
        {
    //        cout<<sr<<"*       *"<<sl<<endl;
    //        cout<<s[sr]<<"    "<<c[cr]<<endl;
            if(s[sr]>c[cr])
            {
                --sr;
                --cr;
                ans+=3;
            }
            else if(s[sr]<c[cr])
            {
                ++sl;
                --cr;
                ans+=1;
            }
            else
            {
                if(s[sl]>c[cl])
                {
                    ++sl;
                    ++cl;
                    ans+=3;
                }
                else
                {
                    if(s[sl]<c[cr])
                    {
                        ++sl;
                        --cr;
                        ans+=1;
                    }
                    else
                    {
                        ++sl;
                        --cr;
                        ans+=2;
                    }
                }
            }
        }
        return ans;
    }
    int main()
    {
        while(cin>>n,n)
        {
            int a[1005];
            int b[1005];
            ME0(a);
            ME0(b);
            for(int i=1; i<=n; ++i)
                cin>>a[i];//C的卡牌
            for(int i=1; i<=n; ++i)
                cin>>b[i];//S的卡牌
            sort(a+1,a+1+n);
            sort(b+1,b+1+n);
            cout<<solve(a,b)<<" ";//求C的最大得分
            //每一局总分一定是4,//求出S的最大得分,就求出了C的最小得分
            cout<<4*n-solve(b,a)<<endl;
        }
    }
  • 相关阅读:
    比较好的总结runtime
    开发证书详解
    删除数组中特定元素推荐做法
    pbxproj文件冲突解决办法
    svn不提交user文件
    c提高第六次课 文件读取
    c++函数指针
    c提高第五次作业
    c提高第四次作业
    c提高第四课
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11073068.html
Copyright © 2020-2023  润新知