1 条题解
-
0
自动搬运
来自洛谷,原作者为

I_will_AKIOI
吾日三省吾身:洛谷等级分 2145 乎?CF Rating 1927 乎?AT 1724 乎?搬运于
2025-08-24 22:54:56,当前版本为作者最后更新于2024-02-04 16:46:26,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题目给的是一个长度为 的序列,太麻烦了,我们把数据规模缩小成 个数来思考。
假设这两个数是 和 ,得到方程 。
若 :
无解。
若 :
若 :
无解。
所以我们可以求出 的范围是 。
也可以根据绝对值的几何意义,得出 一定在他们中点的左侧。
同样的,如果两个数反过来,那么 一定在中点右侧。
于是,我们可以一直枚举相邻两个数,求出 的范围,不断缩小。枚举完成后,看看左端点是否小于右端点,否则无解。否则输出这个区间的中点。
注意开始两个端点要赋成最值,并且输出时注意保留 位小数。我赛时被卡了好几发。
#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
- 上传者