【AtCoder】ABC 481 B - Polyline

B - Polylineatcoder.jp favicon

実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 78 / NoviSteps: 5Q / 配点: 200 点

問題概要

xyxy 平面上に NN 個の点があり、点 ii の座標は (i,Ai)(i,A_i) である。

i=1,2,…,N−1i=1,2,\ldots,N-1 について点 ii と点 i+1i+1 を線分で結び、11 本の折れ線を作る。

この折れ線上(端点も含む)にある点のうち、yy 座標が KK であるものの個数を求めよ。

ただし、制約より条件を満たす点の個数は有限であることが保証される。

制約

  • 2≤N≤1002 \le N \le 100
  • 1≤Ai≤1001 \le A_i \le 100 (1≤i≤N)(1 \le i \le N)
  • Ai≠Ai+1A_i \ne A_{i+1} (1≤i<N)(1 \le i < N)
  • 1≤K≤1001 \le K \le 100
  • 入力される値はすべて整数

考察

頂点が y=Ky = K に一致する場合と、線分の内部で y=Ky = K を横切る場合を分けて数える。

前者は単純に Ai=KA_i = K となる ii の個数を数えればよい。

後者については、Ai<K<Ai+1A_i < K < A_{i+1} または Ai>K>Ai+1A_i > K > A_{i+1} となる ii の個数を数えればよい。

実装例

CPP
1.#include <bits/stdc++.h>
2.using namespace std;
3.
4.#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)
5.
6.// ======================================== //
7.
8.int main()
9.{
10. int N, K;
11. cin >> N >> K;
12. vector<int> A(N);
13. rep(i, 0, N) cin >> A[i];
14.
15. int ans = 0;
16. rep(i, 0, N) {
17. if (A[i] == K) ans++;
18. }
19.
20. rep(i, 0, N - 1) {
21. if ((A[i] < K && K < A[i + 1]) || (A[i] > K && K > A[i + 1])) {
22. ans++;
23. }
24. }
25.
26. cout << ans << endl;
27.
28. return 0;
29.}
atcoder.jp favicon

実装時間: 5 分

コメント

綺麗に書こうとしたら逆に時間かかってしまった。