P10126 「Daily OI Round 3」Pigeon

题目背景

最近,忙吗,也不说打个电话。哦,是吗,嘿嘿原来没给过你号码。但这,不是,你不找我的理由,下次罚你陪我等到太阳出头。——recollect_i 的博客

题目描述

recollect_i 给了你长度为 nnn 的序列 xxx,你需要求出一个实数 yyy 使得对于所有 1≤i<j≤n1\leq i<j\leq n1i<jn∣xj−y∣>∣xi−y∣\vert x_j-y\vert>\vert x_i-y\vertxjy>xiy,或报告无解。

输入格式

第一行一个整数 nnn,表示序列长度。

第二行 nnn 个整数 xxx,表示序列。

输出格式

如果有解,第一行输出字符串 lovely,第二行输出一个实数 yyy

为了避免精度问题,如果您输出的方案满足对于所有 $ 1\leq i<j\leq n,,\vert x_j-y\vert-\vert x_i-y\vert>10^{-6}$,则认为您的答案正确。

同时您需要保证 −2×109≤y≤2×109-2\times 10^9\leq y\leq 2\times 10^92×109y2×109,且 yyy 的小数点后不超过 101010 位,否则无法保证评测的正确性。

如果无解,一行输出字符串 pigeon

输入输出样例 #1

输入 #1

5
1 2 3 4 5

输出 #1

lovely
-114514

输入输出样例 #2

输入 #2

5
3 2 1 6 7

输出 #2

lovely
3.1416

输入输出样例 #3

输入 #3

5
3 2 1 4 5

输出 #3

pigeon

说明/提示

【提示】

输出格式中 >10−6>10^{-6}>106 只是为了避免精度问题,您可以当成要求 ∣xj−y∣>∣xi−y∣\vert x_j-y\vert>\vert x_i-y\vertxjy>xiy

可以证明,如果有解,则一定存在 yyy 满足 −2×109≤y≤2×109-2\times 10^{9}\leq y\leq2\times 10^{9}2×109y2×109 且对于所有 1≤i<j≤n1\leq i<j\leq n1i<jn∣xj−y∣−∣xi−y∣>0.2\vert x_j-y\vert-\vert x_i-y\vert>0.2xjyxiy>0.2,且小数点后位数不超过 333

【数据范围】

对于全部数据保证:5≤n≤1055\leq n\leq10^55n105−109≤xi≤109-10^9\leq x_i\leq10^9109xi109

C++实现

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

const int N = 1e5+10;
const double eps = 1e-6;	//精度
int n;
int a[N];
double l = -2e9 , r = 2e9;	//l和r都是小数,用double存
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	cin >> n;
	for (int i=1 ; i<=n ; i++)	{
		cin >> a[i];
	}
	for (int i=2 ; i<=n ; i++)	{
		if (l>=r || r-l<=eps || a[i]==a[i-1]){
			cout << "pigeon" << endl;
			return 0;
		}
		if (a[i-1]>a[i])	{
			double mid = (double)(a[i-1]+a[i])/2;
			l = max(mid , l);
		}
		if (a[i-1]<a[i])		{
			double mid = (double)(a[i-1]+a[i])/2;
			r = min(mid , r);
		}
	}
	if (l>=r || r-l<eps)	{
		cout << "pigeon" << endl;
		return 0;
	}
	cout << "lovely\n";		//别忘记输出这个了
	cout << fixed << setprecision(7) << l+eps << endl;
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐