2018年10月8日训练日记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37275680/article/details/82974424

今晚将之前未整理完的AtCoder的两道题整理完了,CF上的两题仍没有理解透彻,D三分+集合

个人收藏里有今晚的相关题目

#include<bits/stdc++.h>
using namespace std;
#define ld long double
// from_luogu
int n;
int x[300001],y[300001];
ld chk(ld X){
	ld A=0;
	for(int i=1;i<=n;i++)
		A=max(A,((x[i]-X)*(x[i]-X)+(ld)y[i]*y[i])/((ld)2*y[i]));
	return A;
}

int main(){
	int Mx=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",x+i,y+i);
	if(y[1]<0)
		for(int i=1;i<=n;i++) 
			y[i]=-y[i];
	for(int i=1;i<=n;i++)
		if(y[i]<0)	
			return puts("-1"),0;
	ld l=-1.1e7, r=1.1e7, mid1, mid2;
	for(int i=1;i<=100;i++){
		mid1=(l+l+r)/3, mid2=(l+r+r)/3;
		ld a1=chk(mid1), a2=chk(mid2);
		if(a1>a2) l=mid1;
		else r=mid2;
	} 
	printf("%.10lf\n",(double)chk(mid1));
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define ld long double
// from_luogu
int n;
int x[300001],y[300001];
ld chk(ld X){
	ld A=0;
	for(int i=1;i<=n;i++)
		A=max(A,((x[i]-X)*(x[i]-X)+(ld)y[i]*y[i])/((ld)2*y[i]));
	return A;
}

int main(){
	int Mx=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",x+i,y+i);
	if(y[1]<0)
		for(int i=1;i<=n;i++) 
			y[i]=-y[i];
	for(int i=1;i<=n;i++)
		if(y[i]<0)	
			return puts("-1"),0;
	ld l=-1.1e7, r=1.1e7, mid1, mid2;
	for(int i=1;i<=100;i++){
		mid1=(l+l+r)/3, mid2=(l+r+r)/3;
		ld a1=chk(mid1), a2=chk(mid2);
		if(a1>a2) l=mid1;
		else r=mid2;
	} 
	printf("%.10lf\n",(double)chk(mid1));
	return 0;
}

E题倒是看懂了题,现将大佬的代码放这吧

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

const int maxn = 1e5+100;
int n;

struct point{
	double x,y;
}pp[maxn];

double c(double d){
	double res = 0;
	for(int i=0;i<n;i++){
		res = max(res,(pp[i].y*pp[i].y+(pp[i].x-d)*(pp[i].x-d))/2.0/pp[i].y);
	}
	return res;
}

int main(){
	scanf("%d",&n);
	int xx = 0,yy = 0;
	for(int i=0;i<n;i++){
		scanf("%lf%lf",&pp[i].x,&pp[i].y);
		if(pp[i].y<0) xx++;
		else yy++;
		pp[i].y = fabs(pp[i].y);
 	}
	if(xx&&yy){
		printf("-1\n");
		return 0;
	}
	double ub = 1e7;
	double lb = -1e7;
	while(ub-lb>1e-8){
		double r1 = lb + (ub-lb)/3;
		double r2 = lb + 2*(ub-lb)/3;
		if(c(r1)<c(r2))ub = r2;
		else lb = r1;
	}
	printf("%.7f\n",c(lb));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37275680/article/details/82974424