ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF794A Bank Robbery 题解

2021-12-23 20:35:03  阅读:152  来源: 互联网

标签:保险柜 题解 d% 警察 钞票 CF794A Robbery 小偷 include


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;
}

标签:保险柜,题解,d%,警察,钞票,CF794A,Robbery,小偷,include
来源: https://www.cnblogs.com/Eason-AC/p/15725114.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有