CF924B Three-level Laser 题解

题目传送门~

题目分析

主要思路:枚举每个 i,求出对应最佳情况的 jk,取最大值。

  • i,k 固定时,显然 EkEi 为定值。此时 EkEj 应取最大值,即 Ej 取最小值,j 应取最小值为 i+1

  • i,j 固定时,EkEjEkEi 取最大值当且仅当 Ek 取得最大值且 EkEiU。具体证明见下。这一步可以用二分解决。

证明:EkEjEkEi 取最大值当且仅当 Ek 取得最大值。

假设存在 Ek1<Ek2,x=Ek2Ek1 使得:

Ek1EjEk1Ei>Ek2EjEk2Ei

换元简化式子可得:

ab>a+xb+x(a>0,b>0,x>0) 进一步化简得:a>b 显然矛盾,故假设不成立,原命题成立。

代码

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+5;
int n,k,a[N];
double res = -1;

int find(int i)
{
    int x = a[i]+k,l = i+2,r = n;   
    while (l < r) // 二分
    {
        int mid = l + r + 1 >> 1;
        if (a[mid] <= x) l = mid;
        else r = mid-1;
    }
    if (a[l] <= x) return l;
    else return -1;
}

int main()
{
    scanf("%d%d",&n,&k);
    for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
    for (int i = 1;i <= n-2;i++)
    {
        int x = find(i);
        if (x == -1) continue; // i j k 分别为 i i+1 x
        res = max(res,1.0*(a[x]-a[i+1])/(a[x]-a[i]));   
    }
    if (res < 0) puts("-1"); //不存在
    else printf("%.10f",res);
    return 0;
}
posted @   codwarm  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示