acdream 1207 qj的寻找爱情之旅

题目链接:点击打开链接


二分搜索答案

直接搜索最后一位行不通,因为无法确定中间的数是否>=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;
}



你可能感兴趣的:(二分搜索)