题目链接:点击打开链接
二分搜索答案
直接搜索最后一位行不通,因为无法确定中间的数是否>=0,所以想到搜索第二位,这样之后所有的数实际都确定下来了,再一个一个判断即可。如果这个答案可以,就让r=mid,看更小的行不行。
wa了n次,以为是double型的数递推运算时积累误差太大了,打表找了通项公式,还是wa,最后发现是二分判断每个数是否满足时不能写成>=0,而要写成>=eps。
代码中判断函数写的是通项公式,而实际上递推公式也可以过。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#define eps 1e-8
using namespace std;
double a[1005];
int N;
bool C(double n){
a[2]=n;
for(int i=3;i<=N;i++){
a[i]=-a[1]*(i-2)+a[2]*(i-1)+(i-1)*(i-2);
if(a[i]<eps) return 0;
}
return 1;
}
int main(){
double k;
while(~scanf("%d%lf",&N,&k)){
a[1]=k;
double l=0,r=k;
double mid;
while(r-l>eps){
mid=(r+l)/2;
if(C(mid)) r=mid;
else l=mid;
}
a[2]=mid;
a[N]=-a[1]*(N-2)+a[2]*(N-1)+(N-1)*(N-2);
printf("%.2f\n",a[N]+eps);
}
return 0;
}
本文介绍了一种使用二分搜索解决特定数学问题的方法。通过调整搜索区间来精确找到满足条件的答案,避免了直接搜索可能遇到的问题。文章还讨论了精度控制及通项公式与递推公式的应用。

被折叠的 条评论
为什么被折叠?



