需要舍入吗?
查看原帖
需要舍入吗?
542881
日常放水WT双奔楼主2021/9/21 21:38

代码如下,已AC

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
int n,p[60001],v[60001];
double le[60001],re[60001];
void read(){
	scanf("%d",&n);
	_for(i,1,n) scanf("%d",&p[i]);
	_for(i,1,n) scanf("%d",&v[i]);
}
void init(){
	memset(le,0xff,sizeof(le));
	memset(re,-0xff,sizeof(re));
	//使各区间永远没有交集 
	return;
}
void clac(double t){
	_for(i,1,n) le[i]=p[i]-t*v[i],re[i]=p[i]+t*v[i];//计算出区间下标与上标 
}
double bsearch(double l,double r){
	double mid=(l+r)/2;
	if(l+0.000000000001>r){
		/*_for(i,1,n) printf("%5.1f %5.1f\n",le[i],re[i]);*/
		return mid;//精度达到最高 
		
	}
	clac(mid);
	double maxl=DBL_MIN,minr=DBL_MAX;
	_for(i,1,n) maxl=max(maxl,le[i]),minr=min(minr,re[i]);
	if(maxl==minr){
		/*_for(i,1,n) printf("%5.1f %5.1f\n",le[i],re[i]);*/
		return mid;
	}
	else{
		/*printf("\n%5.1f\n",mid);
		_for(i,1,n) printf("%5.1f %5.1f\n",le[i],re[i]);
		printf("\n");*/
		
		
		
		if(maxl>minr) return bsearch(mid+0.000000000001,r);
		if(maxl<minr) return bsearch(l,mid-0.000000000001);
	}
}

---------------No Copying--------------

int main(int argc,char *argv[]){
	read();
	init();
	
	int minv=INT_MAX,maxp=INT_MIN;
	_for(i,1,n) minv=min(minv,v[i]),maxp=max(maxp,p[i]);
	double ans=bsearch(0, double(maxp)/double(minv));
	printf("%.12lf",ans);
	
	return 0;
}

然后这个代码放在样例2显然是不过的, 但是不知道什么原因就AC了

2021/9/21 21:38
加载中...