一、题目描述
田忌赛马:马速大者获胜,分数+100;马速相等平局,分数不变。则第一队可以获得的最大分数是多少?
第一行:整数n,代表马的数量;
第二行:第一队的 n 匹马的速度;
第二行:第二队的 n 匹马的速度;
二、田忌赛马-敲代码
1、对第一队速度进行排序;
2、遍历第二队每一匹马,二分查找到第一队中刚好大于该马速度的位置。
(1)若找到大于本马的位置,删掉该位置,更新分数+100;
(2)若找不到,查找刚好等于本马的位置。若找到,删掉该位置,分数不变;若找不到,删掉第一队头部最小速度的位置,分数-100。
#include <iostream>
#include <vector>
#include <set>
using namespace std;
/*
输入:
4
9 7 5 3
10 8 5 2
输出:
200
输入:
4
9 7 5 3
10 8 5 5
输出:
100
输入:
4
9 5 10 5
7 3 8 2
输出:
400
*/
int main()
{
//输入
int n;
cin >> n;
multiset<int> st; //注意是 multiset !!!
vector<int> nums(n);
for (int i = 0; i < n; i++) {
int x;
cin >> x;
st.insert(x);
}
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
//
int score = 0; //得分
for (int i = 0; i < n; i++) {
auto it = st.upper_bound(nums[i]); //找一个大于nums[i]的位置
if (it != st.end()) { //大于
st.erase(it);
score += 100;
}
else {
//auto it2 = st.lower_bound(nums[i]); //找一个等于nums[i]的位置
//if (it2 != st.end()) { //相等
// st.erase(it2);
//}
auto it2 = --it;
if (*it2 == nums[i])
{
st.erase(it2);
}
else { //小于
st.erase(st.begin());
score -= 100;
}
}
}
cout << score << endl;
return 0;
}