拼点游戏------贪心

总时间限制: 1000ms 内存限制: 65536kB
描述
C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌,每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌,S随机抽取n张蓝色卡牌,他们进行n回合拼点,每次两人各出一张卡牌,点数大者获得三颗巧克力,小者获得一颗巧克力,如果点数相同,每人各得二颗巧克力,使用过的卡牌不得重复使用。已知C和S取到的卡牌点数,请编程计算S最多和最少能得到多少颗巧克力。
输入
输入包含多组测试数据。
每组测试数据的第一行是一个整数n(1<=n<=1000),接下来一行是n个整数,表示C抽到的白色卡牌的点数,下一行也是n个整数,表示S抽到的蓝色卡牌的点数。
输入的最后以一个0表示结束。
输出
对每组数据,输出一行,内容是两个整数用空格格开,分别表示S最多和最少可获得的巧克力数。
样例输入
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
样例输出
9 5
4 4
4 4
思路:
刚看到这题就感觉和田忌赛马问题特别像,将它分解为比较最大数和最小数的问题,
本质思想都是: 如果我最好的比不过你, 就拿我的最差的比你最好的, 再拿我最好的比你其次好的,具体实现都在代码的注释中

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e3 + 5;
int a[N], b[N];
int n;
int f(int a[], int b[])
{
    int ans = 0;
    int l1 = 0, r1 = n-1, l2 = 0, r2 = n-1;
    while (l1 <= r1 && l2 <= r2) 
    {
        if (b[r2] > a[r1]) //b的最大数大于a的最大数
        { 
            r2--; 
            r1--; 
            ans += 3; 
        }
        else if (b[l2] > a[l1]) //b的最小数大于a的最小数
        { 
            l1++; 
            l2++; 
            ans += 3; 
        }
        else if (b[r2] == a[r1]) //b的最小数和a的最大数相等
        { 
            l2++; 
            r1--; 
            ans += 2;
        }
        else //输了
        { 
            r1--; 
            l2++; 
            ans++; }
    }
    return ans;
}
int main()
{
    while (cin >> n && n)
    {
        for (int i = 0; i < n; i++)
            cin >> a[i];
        for (int i = 0; i < n; i++)
            cin >> b[i];
        sort(a, a + n);
        sort(b, b + n);
        int  max = f(a, b);
        int min=4*n-f(b,a);
        //一共有4*n个巧克力,f(b,a)为C能获得的最多的巧克力数
        cout << max << ' ' << min << endl;

    }
    return 0;
}

发布了19 篇原创文章 · 获赞 24 · 访问量 1958

猜你喜欢

转载自blog.csdn.net/SDAU_LGX/article/details/104894829
今日推荐