【题解】一道题目(2020.2.21)

题解

这一天老师要查第m个同学的成绩,为了不挨批-),MC努力回想,想起成绩单上的一个规律:

若把成绩看作是一个实数数列,则Ai=((Ai-1)-(Ai+1))/2+d,(就是每一项为其前后两项之差除以二再加d)。此时,我告诉了MC一共N项的数列首项A1和末项An,以及d。剩下的靠你了!

变形:Ai = Ai-2 - 2 ( Ai-1 - d )
方法很多,最简单的是对第二项二分,发现第二项越大,后面的偶数项越大,奇数项越小,这就具有单调性,可以二分答案

#include<cstdio>
const double eps = 1e-12;
double d,a[65],An;
int n,m;
bool check() {
    
    
	for(int i=3;i<=n;i++) a[i]=a[i-2]-2*(a[i-1]-d);
	return a[n]>=An;
}
int main(){
    
    
	scanf("%d%d%lf%lf%lf",&n,&m,&d,&a[1],&An);
	double l=-1e12,r=1e12;
	while(r-l>eps) {
    
    
		a[2]=(l+r)/2;
		if(n%2) {
    
    
			if(check()) l=a[2];
			else r=a[2];
		}
		else {
    
    
			if(check()) r=a[2];
			else l=a[2];
		}
	}
	printf("%.3lf",a[m]);
	return 0;
}

这就是计算思维,我们计算一个东西可以从很多方面入手,复杂度和难易程度都是不一样的!还有就是如何避免重复计算,提高效率

猜你喜欢

转载自blog.csdn.net/cqbzlydd/article/details/104429776