AtCoder Beginner Contest 001
A
atcoder 第一题,经典输出 \(A - B\) 。
B
题意
给一个数 \(n\) ,输出函数
\[F(n) =
\left \{
\begin{aligned}
&0, &n < 100, \\
&\lfloor \frac{n}{100} \rfloor, &100 \leq n \leq 5000, \\
&\lfloor \frac{n}{1000} \rfloor + 50, &5000 < n \leq 30000, \\
&\lfloor \frac{\lfloor \frac{n}{1000} \rfloor - 30}{5} \rfloor + 80, &30000 < n \leq 70000, \\
&89, &n > 70000. \\
\end{aligned}
\right .
\]
i64 n; std::cin >> n;
std::cout.fill('0');
std::cout.width(2);
if (n <= 5000) std::cout << n / 100 << "\n";
else if (n <= 30000) std::cout << n / 1000 + 50 << "\n";
else if (n <= 70000) std::cout << (n / 1000 - 30) / 5 + 80 << "\n";
else std::cout << 89 << "\n";
C
题意
一更繁琐一些的输入输出题。
给出整数形式的风的角度和速度。
表格中根据浮点形式进行了风向和风级的划分。
输出它属于哪个方向的风、风力多少级。
输入数据给的角度是是实际的十倍。
输入数据给风速是 \(m/min\) 。
要注意到表格的风速单位是 \(m/s\) ,且是四舍五入。
抄到一个很帅的实现……
- 直接放大浮点数
- 用常数枚举代替 if else
const std::string s[] = {"N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW","N"};
const int a[] = {25,155,335,545,795,1075,1385,1715,2075,2445,2845,3265, 1 << 27};
i64 deg; std::cin >> deg;
int i = 0;
while (deg * 10 >= 1125 + 2250 * i) {
i++;
}
i64 dis; std::cin >> dis;
int j = 0;
while (dis * 10 >= a[j] * 6) {
j++;
}
if (j != 0) std::cout << s[i] << " " << j << "\n";
else std::cout << "C 0" << "\n";
如果直接写 if else 这是个很差的题。但实际上这是个好题。
D
diffculty 1565
题意
题面很繁,考察了一些输入、输出处理,模意义下的进位。
最终考察的是:给 \(n\) 个区间 \([st_i, ed_i]\) ,对所有区间求并。然后按坐标顺序输出所有区间。
题解
把每一个 \(st\) 看作一个 '(' ,每一个 \(ed\) 看作一个 ')' 。
观察每个极大区间 "(????)",内部的 "????" 一定是一个合法括号序列,否则这个区间一定不是极大。于是极大区间 "(????)" 是一个合法括号序列。
我们进一步观察所有极大区间:"(????)(????)(????)" 。
我们将给定的 \(2n\) 个括号按坐标排序,并记录它的种类,就能得到这种形式。
由于每个极大区间是一个合法括号序列,我们从一侧开始贪心地选择合法括号序列,就能得到所有极大并区间。
view
int n; std::cin >> n;
std::vector<std::array<int, 2> > vec;
for (int i = 1; i <= n; i++) {
char c;
int st, ed;
std::cin >> st >> c >> ed;
st = st / 5 * 5;
ed = (ed + 4) / 5 * 5;
if (st % 100 == 60)
st += 40;
if (ed % 100 == 60)
ed += 40;
vec.push_back({st, 0});
vec.push_back({ed, 1});
}
std::sort(vec.begin(), vec.end());
std::vector<std::array<int, 2> > ans;
int cnt = 0;
for (int i = 0; i < vec.size(); i++) {
if (vec[i][1] == 0) {
if (cnt == 0)
ans.push_back({vec[i][0], -1});
cnt++;
}
else {
cnt--;
if (cnt == 0)
ans.back()[1] = vec[i][0];
}
}
for (auto x : ans) {
std::cout << std::setw(4) << std::setfill('0') << x[0] << "-";
std::cout << std::setw(4) << std::setfill('0') << x[1] << "\n";
}
——永远是挑战而不是练习,下次一定更好。