• luogu1419 寻找段落


    题目

    luogu1419

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #define N 100005
    #define inf 1000000000
    #define ll long long
    using namespace std;
    
    int n,s,t,a[N];
    double sum[N];
    
    int q[N];//q纪录起始位置
    bool check(double x)
    {
    	//将原序列全部减去平均值,sum记录前缀和 
    	for(int i=1;i<=n;i++) sum[i]=(double)sum[i-1]+a[i]-x;
    	int head=1,tail=0;
    	for(int i=s;i<=n;i++)
    	{
    		while(tail>=head&&i-t+1>q[head]) head++;//若区间长度大于t,将起始点删去 
    		while(tail>=head&&sum[i]-sum[i-s]>sum[i]-sum[q[tail]-1]) tail--;//若之前存在的起始点比新加入的起始点更优,删除新加入的点 
    		q[++tail]=i-s+1;//添加起始点 
    		if(sum[i]-sum[q[head]-1]>=0) return true;
    	}
    	return false;
    }
    
    int main()
    {
    	scanf("%d%d%d",&n,&s,&t);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    	double l=-10000,r=10000,mid,ans;//二分段落最大平均值
    	while(l+1e-5<r)
    	{
    		mid=(l+r)/2;
    		if(check(mid)) ans=mid,l=mid+1e-5;
    		else r=mid;
    	} 
    	printf("%.3lf",ans);
    	return 0;
    }
  • 相关阅读:
    Android系统根文件系统目录结构
    4面 晶晨半导体 问题总结
    linux 工作队列
    Linux tasklet 的测试
    ArbotiX-M引脚说明
    locobot
    视频地址
    S1雷达ROS包更新指南
    rospy
    mx-28在 labview环境下的开发
  • 原文地址:https://www.cnblogs.com/XYZinc/p/7640883.html
Copyright © 2020-2023  润新知