题解:P13474 [GCJ 2008 APAC SemiFinal] What are Birds?
zhanghq2012 · · 题解
题目链接
题目传送门
Solution
分析
给定一系列已知鸟类和非鸟类的动物数据(包含身高和体重),以及一些未知动物的数据,需要判断每个未知动物属于以下哪类:
- 在鸟类边界内
→ BIRD。 - 在边界外但扩展范围无冲突
→ UNKNOWN。 - 在边界外且扩展范围有冲突
→ NOT BIRD。实现步骤
- 计算所有鸟类的最小/最大身高
(minH/maxH) 。 - 计算所有鸟类的最小/最大体重
(minW/maxW) 。 - 判定。
AC代码
#include <bits/stdc++.h> using namespace std;
struct stu { int height; int weight; };
int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int c; cin >> c; for (int num = 1; num <= c; num++) { int n; cin >> n; vector<stu> birds; vector<stu> notBirds; //设置最值 int minh = INT_MAX; int maxh = INT_MIN; int minw = INT_MAX; int maxw = INT_MIN; for (int i = 1; i <= n; i++) { int h, w; string part1, part2; cin >> h >> w >> part1; if (part1 == "BIRD") { birds.push_back({h, w}); minh = min(minh, h); maxh = max(maxh, h); minw = min(minw, w); maxw = max(maxw, w); } else if (part1 == "NOT") { cin >> part2; // 读取后面的"BIRD" notBirds.push_back({h, w}); } } int m; cin >> m; vector<stu> unknowns(m); for (int i = 0; i < m; i++) { cin >> unknowns[i].height >> unknowns[i].weight; } cout << "Case #" << num << ":\n"; for (auto a : unknowns) { if (birds.empty()) { cout << "UNKNOWN\n"; continue; } if (a.height >= minh && a.height <= maxh && a.weight >= minw && a.weight <= maxw) { cout << "BIRD\n"; continue; } int minhh = min(minh, a.height); int maxhh = max(maxh, a.height); int minww = min(minw, a.weight); int maxww = max(maxw, a.weight);
bool flag = false;
for (auto n : notBirds) {
if (n.height >= minhh && n.height <= maxhh &&
n.weight >= minww && n.weight <= maxww) {
flag = true;
break;
}
}
if (flag) {
cout << "NOT BIRD\n";
}
else {
cout << "UNKNOWN\n";
}
}
}
return 0;
}