题意:
有n个位置,敌人可能在任意一个位置。你可以扔一个炸弹,炸掉连续3个位置,之后敌人可以移动到相邻位置或者不动。要求最坏情况下最少要多少炸弹。
思路:
因为要求最坏情况下的最优值,所以我们要求我们的炸弹可以覆盖所有范围,且炸弹数最少。
最优策略就是炸完一个位置,到这个位置下面继续炸。
如炸了 1,那么1 2 3都被炸,然后继续炸3,3 4 5被炸,继续炸5以此类推。
因为假设你两次爆炸区域之间没有相交,上次爆炸的区间就都成了不安全区域了。
第一次:
爆炸前:不安全区域为n,安全区域为0。
爆炸后:不安全区域为n-3,安全区域为3。
第二次:
爆炸前:不安全区域为n-1,安全区域为1。
爆炸后:不安全区域为n-4,安全区域为4。
第三次:
爆炸前:不安全区域为n-2,安全区域为2。
爆炸后:不安全区域为n-5,安全区域为5。
这样可以看出,放了x个炸弹,可以保证第x次爆炸后安全区域个数为x+2,所以我们只需要n-2个炸弹就好了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int main() {
int n;scanf("%d",&n);
if(n <= 3) printf("%d\n",1);
else printf("%d\n",n - 2);
return 0;
}