关于#c++#的问题:我看了题解以后只是把题解中数组实现的队列换成stl库里面的deque,为什么换了以后测试点变成一个没过了

洛谷第1419题,https://www.luogu.com.cn/problem/P1419我看了题解以后只是把题解中数组实现的队列换成stl库里面的deque,为什么换了以后测试点变成一个没过了。
题解是这样的

#include <iostream>
#include <cstdio>
#include <cstdlib>
#define maxn 100010

using namespace std;

int n, s, t, i;
double l, r, mid, ans;
double a[maxn];
int b[maxn];
double sum[maxn];
int q[maxn];

bool check(double x) {
    int i, l = 1, r = 0;
    for (i = 1; i <= n; i++)
        a[i] = (double)b[i] - x;
    sum[0] = 0;
    for (i = 1; i <= n; i++)
        sum[i] = sum[i - 1] + a[i];
    for (i = 1; i <= n; i++) {
        if (i >= s) {
            while (r >= l && sum[i - s] < sum[q[r]])    r--;
            q[++r] = i - s;
        }
        if (l <= r && q[l] < i - t) l++;
        if (l <= r && sum[i] - sum[q[l]] >= 0) return true;
    }//检查区间和,即0到i的和减去0q[l]的和,q里面是下标。
    return false;
}

int main() {

    scanf("%d", &n);
    scanf("%d%d", &s, &t);
    for (i = 1; i <= n; i++)
        scanf("%d", &b[i]);
    ans = l = -10000; r = 10000;
    while (r - l > 1e-5) {
        mid = (l + r) / 2;
        if (check(mid))
            ans = l = mid;
        else r = mid;
    }

    printf("%.3lf\n", ans);
    return 0;
}


改了以后一个没过:

#include <iostream>
#include <deque>
#include <cstdio>
#define maxn 100010

using namespace std;

int n, s, t, i;
double l, r, mid, ans;
double a[maxn];
int b[maxn];
double sum[maxn];
deque<int> q;

bool check(double x) {
    int i, l = 1, r = 0;
    for (i = 1; i <= n; i++)
        a[i] = (double)b[i] - x;
    sum[0] = 0;
    for (i = 1; i <= n; i++)
        sum[i] = sum[i - 1] + a[i];
    for (i = 1; i <= n; i++) {
        if (i >= s) {
            while (!q.empty() && sum[i - s] < sum[q.back()]) {
                q.pop_back();
            }
            q.push_back(i - s);
        }
        if (!q.empty() && q.front() < i - t) {
            q.pop_front();
        }
        if (!q.empty() && sum[i] - sum[q.front()] >= 0) {
            return true;
        }
    }
    return false;
}

int main() {

    scanf("%d", &n);
    scanf("%d%d", &s, &t);
    for (i = 1; i <= n; i++)
        scanf("%d", &b[i]);
    ans = l = -10000;
    r = 10000;
    while (r - l > 1e-5) {
        mid = (l + r) / 2;
        if (check(mid))
            ans = l = mid;
        else
            r = mid;
    }

    printf("%.3lf\n", ans);
    return 0;
}


  • 这篇博客: 挑战C站最强C++ STL标准库总结(内含大量示例)中的 3.2 deque构造函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • deque容器构造的函数原型:

    函数原型

    功能

    deque deqT;

    默认构造形式。

    deque(beg, end);

    构造函数将[beg, end)区间中的元素拷贝给本身。

    deque(n, elem);

    构造函数将n个elem拷贝给本身。

    deque(const deque &deq);

    拷贝构造函数。

    示例:

    #include <deque>
    #include <iostream>
    using namespace std;
    void printDeque(const deque<int>& d)
    {
    	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++) {
    		cout << *it << " ";
    
    	}
    	cout << endl;
    }
    //deque构造
    void test01() {
    
    	deque<int> d1; //无参构造函数
    	for (int i = 0; i < 10; i++)
    	{
    		d1.push_back(i);
    	}
    	printDeque(d1);
    	deque<int> d2(d1.begin(),d1.end());//构造函数将[beg, end)区间中的元素拷贝给本身。
    	printDeque(d2);
    
    	deque<int>d3(10,100);//构造函数将n个elem拷贝给本身。
    	printDeque(d3);
    
    	deque<int>d4 = d3;//拷贝构造函数。
    	printDeque(d4);
    }
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }