Spider Mine 的排布
Description
占星教为了在各门派之争中立于不败之地,下设许多“堂”来研究各种新奇的战术,本 周,他们的课题就是:如何将一排排满的Spider Mine(蜘蛛雷)封锁一个路口。
由于SC 中不同的蜘蛛雷所控制的范围不同,为了简化问题,我们将告诉你现在有多少 个可选位置来埋雷,以及每个位置上雷的控制范围。我们希望知道这些雷是否可以封锁路口, 以及如果可以最少取出其中的多少颗就可以封锁路口了。(当然要假设别人没有反隐的东东 咯~~)。
Format
Input
输入数据共N+1 行
第1 行为两个正整数N,M,分别表示有多少颗可选的雷,以及路口的长度(表示[1,M]的闭区间)
第 2-n+1 行每行两个正整数,表示每个蜘蛛雷可控制的范围。
Output
输出数据共一行
如果蜘蛛雷可以控制整个路口,那么输出最少需要的雷数。
如果不能控制,那么输出“Impossible”。
Samples
输入数据 1
3 10
1 5 3 6 6 10
输出数据 1
2
输入数据 2
3 10
1 2 3 6 8 10
输出数据 2
Impossible
Limitation
对于 30%的数据,1<=N<=100,1<=M<=300;
对于 70%的数据,1<=N<=10000,1<=M<=3000000;
对于 100%的数据,1<=N<=1000000,1<=M<=232-1;
首先,我们要根据输入数据的格式,编写代码来读取输入的信息。根据题目描述,我们需要获取可选雷的数量N,路口长度M和每个雷的控制范围。并且要判断雷能否控制整个路口。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> ranges; // 存储每个雷的控制范围
for (int i = 0; i < N; i++) {
int range;
cin >> range;
ranges.push_back(range);
}
// TODO: 下面的代码是空的,请继续编写。
return 0;
}
接下来,我们需要计算出每个雷所控制的实际范围。由于蜘蛛雷是从路口中心往两边放的,所以实际的控制范围为雷的控制范围除以2加上1。例如,控制范围为3的雷,实际控制范围为(3 / 2) + 1 = 2。我们可以使用一个循环来计算每个雷的实际控制范围,并将其保存在一个新的向量中。
然后,我们需要判断是否可以将雷排放在路口上,以覆盖整个路口。我们可以使用一个滑动窗口来模拟雷的排列过程,并检查是否有未被覆盖的部分。
最后,我们需要计算需要取出多少颗雷来封锁路口。我们可以通过记录每个不覆盖的部分的长度,再取其中最小的部分来得到需要取出的雷的数量。
下面是完整的解决方案:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> ranges; // 存储每个雷的控制范围
for (int i = 0; i < N; i++) {
int range;
cin >> range;
ranges.push_back(range);
}
vector<int> actualRanges; // 存储每个雷的实际控制范围
for (int i = 0; i < ranges.size(); i++) {
int actualRange = (ranges[i] / 2) + 1;
actualRanges.push_back(actualRange);
}
int left = 1; // 左边界
int right = 1; // 右边界
int uncoveredLength = M; // 未被覆盖的长度
int minCount = N; // 最少需要取出的雷的数量
for (right = 0; right < actualRanges.size(); right++) {
uncoveredLength -= actualRanges[right];
// 如果未被覆盖的长度小于等于0,表示整个路口已被覆盖
if (uncoveredLength <= 0) {
int count = right - left + 1;
minCount = min(minCount, count);
// 将左边界向右移动,并更新未被覆盖的长度
uncoveredLength += actualRanges[left];
left++;
}
}
// 如果未被覆盖的长度大于0,表示无法封锁整个路口
if (uncoveredLength > 0) {
cout << "Impossible" << endl;
} else {
cout << minCount << endl;
}
return 0;
}
希望这个解决方案对你有帮助!如果你有任何疑问,请随时提问。