骁坑小坑 2023-06-15 12:07 采纳率: 0%
浏览 7

关于#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;
}


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-15 14:11
    关注
    • 这篇博客: 挑战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;
      }
      
    评论

报告相同问题?

问题事件

  • 创建了问题 6月15日

悬赏问题

  • ¥15 距离软磁铁一定距离的磁感应强度大小怎么求
  • ¥15 霍尔传感器hmc5883l的xyz轴输出和该点的磁感应强度大小的关系是什么
  • ¥15 vscode开发micropython,import模块出现异常
  • ¥20 Excel数据自动录入表单并提交
  • ¥30 silcavo仿真,30分钟,只需要代码
  • ¥15 FastReport 怎么实现打印后马上关闭打印预览窗口
  • ¥15 利用3支股票数据估计其均值和方差的95%置信区间。
  • ¥15 微信小程序运行一项功能时,弹出未知错误弹框,检查代码没有问题
  • ¥15 ATAC测序生成self-pseudo replicates之前是否要进行去线粒体reads
  • ¥15 python模糊字匹配函数问题