拼点游戏 OpenJ_Bailian - 4005 (贪心)

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

这道题目和田忌赛马问题极为类似, 本质思想都是: 如果我最好的比不过你, 就拿我的最差的比你最好的, 再拿我最好的比你其次好的

        (1)如果B的大点数牌能赢A的大点数牌,则进行比较,否则执行(2);
        (2)如果B的小点数牌能赢A的小点数牌,则进行比较,否则执行(3);
        (3)如果B的小点数牌能平A的大点数牌,则进行比较,否则执行(4);
        (4)将B的小点数牌和A的大点数牌进行比较;

//拼点游戏 贪心
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;

int n, input;
vector<int> c, s, curC, curS;
bool cmp(int a, int b)
{
    return a > b;
}
int main()
{
    while(cin >> n && n!=0){
        c.clear(), s.clear(), curC.clear(), curS.clear();
        for(int i = 1; i <= n; i++){
            scanf("%d",&input);
            c.push_back(input);
        }
        for(int i = 1; i <= n; i++){
            scanf("%d",&input);
            s.push_back(input);
        }
        sort(c.begin(), c.end(), cmp), sort(s.begin(), s.end(), cmp);
        curC = c, curS = s; //当前操作的c和s
        int maxAns = 0, minAns = 0;
      /*(1)如果B的大点数牌能赢A的大点数牌,则进行比较,否则执行(2);
        (2)如果B的小点数牌能赢A的小点数牌,则进行比较,否则执行(3);
        (3)如果B的小点数牌能和A的大点数牌,则进行比较,否则执行(4);
        (4)将B的小点数牌和A的大点数牌进行比较;*/
        while(!curS.empty()){
            int cmax = curC.front(), cmin = curC.back(), smax = curS.front(), smin = curS.back();
            if(smax > cmax)
                maxAns += 3, curC.erase(curC.begin()), curS.erase(curS.begin());
            else if(smin > cmin)
                maxAns += 3, curC.pop_back(), curS.pop_back();
            else if(smin == cmax)
                maxAns += 2, curC.erase(curC.begin()), curS.pop_back();
            else
                maxAns += 1, curC.erase(curC.begin()), curS.pop_back();
        }
        curC = c, curS = s;
        while(!curC.empty()){
            int cmax = curC.front(), cmin = curC.back(), smax = curS.front(), smin = curS.back();
            if(cmax > smax)
                minAns += 1, curS.erase(curS.begin()), curC.erase(curC.begin());
            else if(cmin > smin)
                minAns += 1, curS.pop_back(), curC.pop_back();
            else if(cmin == smax)
                minAns += 2, curS.erase(curS.begin()), curC.pop_back();
            else
                minAns += 3, curS.erase(curS.begin()), curC.pop_back();
        }
        printf("%d %d\n",maxAns, minAns);
    }
    return 0;
}

参考博客: https://blog.csdn.net/ccf15068475758/article/details/53192208

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/83145732