题目链接
https://www.acwing.com/problem/content/1857/
解析
一个一维的bfs+暴力,暴力枚举每一个最开始击中的点,然后通过bfs把所有符合要求的点加进队列,然后更新下一轮的点。需要注意的有两点:
统计会爆炸的点的个数:将每个会爆炸的点加进队列,在每个点出队列的时候记一个cnt就行;不要只加入每轮引爆最左边和最右边的点,这样可能是不全面的。
学习怎么一轮一轮地改变爆炸范围
Ac代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <map> using namespace std; const int N = 110; int cnt; int start, n; queue<int> q; int a[N]; bool st[N]; map<int, int> mp; void bfs(int x) { cnt = 0; memset(st, 0, sizeof st); mp[x] = 1; q.push(x); st[x] = true; int right, left; while(q.size()) { int s = q.front(); q.pop(); cnt ++; left = s - 1, right = s + 1; while(left >= 1 && a[s] - a[left] <= mp[s]) { if(st[left]) left --; else{ q.push(left); st[left] = true; mp[left] = mp[s] + 1; left --; } } while(right <= n && a[right] - a[s] <= mp[s]) { if(st[right]) right ++; else{ q.push(right); st[right] = true; mp[right] = mp[s] + 1; right ++; } } } return; } int main() { scanf("%d", &n); for(int i = 1; i <= n; i ++) scanf("%d", &a[i]); sort(a + 1, a + n + 1); int ans = 0; for(int i = 1; i <= n; i ++){ bfs(i); ans = max(ans, cnt); } printf("%d\n", ans); return 0; }