【发布时间】:2020-11-20 21:06:39
【问题描述】:
我正在尝试 Codility 鱼挑战,描述如下:
给定两个由 N 个整数组成的非空数组 A 和 B。 数组 A 和 B 代表河流中的 N 条贪婪的鱼,有序 顺着河流顺流而下。
鱼从 0 到 N - 1 编号。如果 P 和 Q 是两条鱼并且 P
鱼数P用A[P]和B[P]表示。数组 A 包含 鱼的大小。它的所有元素都是独一无二的。数组 B 包含 鱼的方向。它仅包含 0 和/或 1,其中:
0代表一条鱼在上游,1代表一条鱼在上游 下游。如果两条鱼朝相反的方向移动并且没有 他们之间的其他(活)鱼,他们最终会相遇 其他。那么只有一条鱼可以活着——大鱼吃掉了 较小的一个。更准确地说,我们说两条鱼 P 和 Q 相遇 其他当 P
如果 A[P] > A[Q] 那么 P 吃掉 Q,P 仍然会顺流而下, 如果 A[Q] > A[P] 则 Q 吃掉 P,Q 仍将向上游流动。我们 假设所有的鱼都以相同的速度流动。也就是鱼 朝着同一个方向前进,永远不会相遇。目标是计算 能存活的鱼的数量。
例如,考虑数组 A 和 B,这样:
A[0] = 4 B[0] = 0 A1 = 3 B1 = 1 A2 = 2 B2 = 0
A[3] = 1 B[3] = 0 A[4] = 5 B[4] = 0 最初所有的鱼都是 还活着,除了 1 号鱼外,所有的鱼都在逆流而上。鱼数 1 遇到 2 号鱼并吃掉它,然后它遇到 3 号鱼并吃掉 它也。最后,它遇到了 4 号鱼并被它吃掉了。这 剩下的两条鱼,0号和4号,永远不会相遇,因此留下 活着。写一个函数:
int 解(向量 &A, 向量 &B);
给定两个由 N 个整数组成的非空数组 A 和 B, 返回存活的鱼的数量。
例如,给定上面显示的数组,函数应该返回 2,如上所述。
为以下假设编写一个有效的算法:
N 是 [1..100,000] 范围内的整数;数组 A 的每个元素 是 [0..1,000,000,000] 范围内的整数;的每个元素 数组 B 是一个整数,可以具有以下值之一:0、1; A 的元素都是不同的。
我的解决方法如下:
// you can use includes, for example:
// #include <algorithm>
#include <queue>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
int solution(vector<int> &A, vector<int> &B) {
// write your code in C++14 (g++ 6.2.0)
std::queue<int> downStreamers;
int deadFish = 0;
for(int i = 0; i < (int)B.size(); i++)
{
int direction = B[i];
int size = A[i];
if(direction == 1)
downStreamers.push(size);
else
{
while(!downStreamers.empty())
{
deadFish += 1;
if(size > downStreamers.front())
{
downStreamers.pop();
}
else
break;
}
}
}
return A.size()-deadFish;
}
这是我设计这段代码的方式(在我的脑海中):
称为 downStreamers 的队列结构将包含向下游方向移动的鱼 (1)
deadFish 将包含因方向碰撞而发生的死亡计数器
循环:
对于每条鱼我
- 检查 i 鱼是否在下游 (1),如果是,则添加所述的大小 排在下游队列后面的鱼。
- 鉴于第 i 条鱼正在上游 (0),我想增加 deadFish 计数器,因为队列不为空。如果鱼被 downStreamers 堆栈击败,只需退出循环,否则从 downStreamers 中弹出鱼,直到它为空。
在循环结束时,结果应该是鱼的数量 (A.size()) - deadFishes。这适用于简单的测试用例。但是,它无法解决隐藏的问题,并且 codility 并没有提供太多关于哪里出了问题的反馈。
这是我的测试结果。
如果有人能向我提供有关如何以万无一失的方式解决这些问题的见解,我将不胜感激。
【问题讨论】:
-
你能在问题中添加挑战描述吗?
-
我更新了帖子。
标签: c++