题解:B3745 [语言月赛202304] 你的牌太多了
\textbf{Solution}
选择与扶苏本轮打出的牌花色相同且点数大于扶苏打出的牌中点数最小的一张打出。
上面这句话是题目的核心。
首先,必然要开题目描述中的
接下来,对于每一个
接下来,题目要求找到牌中点数最小的一张打出。所以我们需要一个记录答案编号的变量
最后如果可以打出牌的话,那么要将
最后结果就是统计
\textbf{Code}
#include <iostream>
#include <algorithm>
const int N = 110;
bool b[N]; // 标记小 F 的牌是否被使用
int n, m, r, f1[N], p1[N], f2[N], p2[N] = {(int)2e9};
// p2[0] = 2e9 是因为 minn 初始值为 0,且应该是 inf
int read() { int x; std::cin >> x; return x; }
int main() {
// 读入
std::cin >> n >> m >> r;
std::generate_n(f1 + 1, n, read);
std::generate_n(p1 + 1, n, read);
std::generate_n(f2 + 1, n, read);
std::generate_n(p2 + 1, n, read);
// 模拟
for (int t = 1, p; t <= n; ++t) {
std::cin >> p;
int minn = 0; // 出的牌的编号
for (int i = 1; i <= n; ++i)
if (!b[i] && f2[i] == f1[p] && p2[i] > p1[p] && p2[i] < p2[minn]) minn = i;
if (minn) b[minn] = true;
}
// 统计
// std::count(begin, end, val),统计 [begin,end) 区间内 val 的数量
std::cout << std::count(b + 1, b + n + 1, false) << std::endl;
return 0;
}