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