算法题(183):质量检测
审题:
本题需要我们求出Q序列并逐行打印
思路:
首先我们需要知道Qm是什么意思:根据题意,m是题目给定的值,而Qm表示一段索引1~m的区间的质量最差值,Qm+1表示索引2~m+1的区间
综上所述,其实题目就是要我们求每段长度为m的区间的最差质量值并输出
方法一:滑动窗口
我们可以利用双端队列来解决滑动窗口的求最值题目
解题:
#include<iostream> #include<deque> using namespace std; const int N = 1e5 + 10; int a[N]; int n, m; int main() {cin >> n >> m;for (int i = 1; i <= n; i++){cin >> a[i];}//查找最差质量deque<int> q;//存下标for (int i = 1; i <= n; i++){while (q.size() && a[q.back()] >= a[i]) q.pop_back();q.push_back(i);if (q.back() - q.front() + 1 > m) q.pop_front();if (i >= m) cout << a[q.front()] << endl;}return 0; }
注意:
1.队列存储的是下标
2.使用队列相关接口的时候需要先判断队列是否为空
3.要利用存储的下标来判断最前面出现的产品是否还在窗口中
4.最终输出的是产品的质量值,所以要根据队列中存储的索引映射回a数组输出
P2251 质量检测 - 洛谷