1. 程式人生 > 其它 >CF794A Bank Robbery 題解

CF794A Bank Robbery 題解

CF794A Bank Robbery 題解

Content

  • 有一家有若干個保險櫃的銀行,從左往右分別標號為 \(1,2,3,...\)
  • \(n\) 張鈔票,其中第 \(i\) 號鈔票在第 \(x_i\) 號保險櫃裡。
  • 一個小偷在 \(a\) 號保險櫃,他想偷走保險櫃裡面儘可能多的鈔票。
  • 有兩個警察,一個警察在 \(b(b<a)\) 號保險櫃處,一個警察在 \(c(c>a)\) 處,他們都不會動。
  • 小偷可以偷走箱子裡面的鈔票,也可以移動到相鄰的保險櫃,但是他不能走到任何一個有警察看守的保險櫃。
  • 求這個小偷最多可以偷走多少張鈔票。
  • \(1\leqslant b<a<c\leqslant 10^9,1\leqslant n\leqslant 10^5,1\leqslant x_i\leqslant 10^9\)

Solution

如果我們略微想一下就明白這個問題的實質了:求所有在 \((b,c)\) 區間內的所有保險櫃中的鈔票總數。

為什麼呢?

因為根據輸入限制,小偷一定會在兩個警察之間,又因為小偷不能走到有警察的保險櫃,且小偷一次只能走一步,所以到 \(b\) 或者到 \(c\) 都不行,所以只能去偷所有在 \((b,c)\) 區間內的保險櫃裡面的鈔票。

那麼如何處理這些資料呢?用桶來存嗎?

\(b<a<c\leqslant10^9\) 的資料讓我們一震:不能用桶來存了,會 \(\texttt{MLE}\)

那該怎麼存?

你想想,如果我們去偷的話只會偷 \((b,c)\) 區間裡的鈔票,那不就是相當於判斷對於一個鈔票所在的保險櫃 \(x_i\)

,是否有 \(b<x_i<c\) 就好了嘛?其他在此之外的所有鈔票一律忽略,這樣的空間就大大減少了很多了。

因此,最後的答案就是對於 \(i\in[1,n]\),滿足 \(b<x_i<c\)\(i\) 的個數。這個就非常好判斷了。

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int a, b, c, n, x[100007], ans;

int main() {
	scanf("%d%d%d%d", &a, &b, &c, &n);
	for(int i = 1; i <= n; ++i) {
		scanf("%d", &x[i]);
		if(x[i] > b && x[i] < c)	ans++;
	}
	printf("%d", ans);
	return 0;
}