【OpenJ_Bailian - 4005】拼点游戏(贪心)

拼点游戏

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

 

posted on 2019-06-23 15:52  Sky丨Star  阅读(739)  评论(0编辑  收藏  举报

导航