openjudge滑动窗口题解题代码

首先,我的解法来自https://blog.csdn.net/justmeh/article/details/5844650这篇博客的提示

这道题是一个典型的单调队列的应用题

下面粘贴我的代码

#include
using namespace std;

int arr[1000000];//存放原始数据
int que[1000000];//表示单调队列,里面存放的是指向arr索引值

//在这个地方,我犯了一个错误,
//我一开始是将head和tail全部赋为0,然后通过head是否和tail相等来判断队列是否为空
//这样的话队列一开始没有元素和队列有一个元素(head和tail也是同一值)都被判空了,于是就出错了。
int head = 0, tail = -1;
bool empty() {
    return head > tail;
}
int n, k;

int main() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    //找到最小值
    for (int i = 0; i < n; i++) {
        while (!empty() && arr[que[tail]] >= arr[i])tail--;        //删除末尾元素
        tail++;
        que[tail] = i;                                            //添加一个新元素
        while (que[head] <= i - k)head++;                        //判断首位的索引是否过期
        /*for (int j = head; j <= tail; j++) {可以用这句代码看看每次添加完一个数后,队列的情况
        cout << arr[que[j]] << " ";
        }cout << endl;*/

        if (i >= k - 1)cout << arr[que[head]] << " ";//在滑动窗体可以输出的地方输出
    }
    cout << endl;

    //找到最大值
    head = 0; tail = -1;
    for (int i = 0; i < n; i++) {
        while (!empty() && arr[que[tail]] <= arr[i])tail--;//删除末尾元素
        tail++;
        que[tail] = i;
        while (que[head] <= i - k)head++;
        /*for (int j = head; j <= tail; j++) {
        cout << arr[que[j]] << " ";
        }cout << endl;*/

        if (i >= k - 1)cout << arr[que[head]] << " ";
    }

    return 0;
}

你可能感兴趣的:(2018年为准备CCF,CSP的第一遍刷题)