7.23CF加训

莫名感觉CF的架构比牛客不容易上手,总之用起来有点艰难……

贴一个补题吧:

B

不知为何,GNU C11始终过不了,但是GNU C++ 17就可以……不知哪里出了问题。

点击以显示 ⇲

点击以隐藏 ⇱

#include<stdio.h>
#include<math.h>
 
const double pi=acos(-1);
 
int n;
double g[15],l[15],k[15];
 
double Sin(double k)
{
	return (k>0?1:-1)*sqrt((k*k)/(1+(k*k)));
}
 
double Cos(double k)
{
	return sqrt(1/(1+(k*k)));
}
 
double solve(double k0,double kn)
{
	double c=(k0-kn)/(g[n]-g[0]+g[n-1]-g[1]),rt=0;
	int i;
	for(i=1;i<=n;i++)
	{
		k[i]=kn+c*(g[n]-g[i-1]+g[n-1]-g[i]);
		rt+=l[i]*Sin(k[i]);
	}
	return rt;
}
 
double judge(double k0)
{
	double ll=-pi/2,rr=0,mid;
	while((rr-ll)>3e-16)
	{
		mid=(ll+rr)/2;
		(solve(tan(k0),tan(mid))>0)?(rr=mid):(ll=mid);
	}
	double rt=0;
	int i;
	for(i=1;i<=n;i++)
	{
		rt+=l[i]*Cos(k[i]);
	}
	return rt;
}
 
int main()
{
	double L;
	scanf("%d%lf",&n,&L);
	int i;
	for(i=1;i<=n;i++)
	{
		scanf("%lf",&l[i]);
		g[i]=g[i-1]+l[i];
	}
	double ll=0,rr=pi/2,mid;
	while((rr-ll)>3e-16)
	{
		mid=(ll+rr)/2;
		(judge(mid)<L)?(rr=mid):(ll=mid);
	}
	double x=0,y=0;
	for(i=1;i<n;i++)
	{
		x+=l[i]*Cos(k[i]);
		y+=l[i]*Sin(k[i]);
		printf("%.10lf %.10lf\n",x,y);
	}
	return 0;
}