1 条题解

  • 0
    @ 2025-8-24 22:54:56

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar I_will_AKIOI
    吾日三省吾身:洛谷等级分 2145 乎?CF Rating 1927 乎?AT 1724 乎?

    搬运于2025-08-24 22:54:56,当前版本为作者最后更新于2024-02-04 16:46:26,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目给的是一个长度为 nn 的序列,太麻烦了,我们把数据规模缩小成 22 个数来思考。

    假设这两个数是 2233,得到方程 3y>2y|3-y|>|2-y|

    y2y\le2

    3y>2y3-y>2-y 3>23>2

    无解。

    2<y32<y\le3

    3y>y23-y>y-2 5>2y5>2y y<2.5y<2.5

    y>3y>3

    y3>y2y-3>y-2 0>10>1

    无解。

    所以我们可以求出 yy 的范围是 (,2.5)(-\infty,2.5)

    也可以根据绝对值的几何意义,得出 yy 一定在他们中点的左侧。

    同样的,如果两个数反过来,那么 yy 一定在中点右侧。

    于是,我们可以一直枚举相邻两个数,求出 yy 的范围,不断缩小。枚举完成后,看看左端点是否小于右端点,否则无解。否则输出这个区间的中点。

    注意开始两个端点要赋成最值,并且输出时注意保留 1010 位小数。我赛时被卡了好几发。

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n,a[100005];
    double l=-1e9,r=1e9;
    signed main()
    {
      ios::sync_with_stdio(0);
      cin>>n;
      for(int i=1;i<=n;i++) cin>>a[i];
      for(int i=1;i<n;i++)
      {
      	if(a[i]<=a[i+1]) r=min(r,0.5*(a[i]+a[i+1]));
      	if(a[i]>=a[i+1]) l=max(l,0.5*(a[i]+a[i+1]));
        //不写if-else的原因是防止两数相等
      }
      if(l>=r) cout<<"pigeon";
      else printf("lovely\n%.10f",0.5*(l+r));
      return 0;
    }
    
    • 1

    信息

    ID
    9502
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者