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";
    }
posted @ 2024-07-13 03:52  03Goose  阅读(9)  评论(0)    收藏  举报