[ACM] [バイナリ検索] Luogu P1024単項3次方程式の解

1つの変数の3次方程式を解く

アイデア:

この質問は二分法の質問票に含まれているため、暴力的な場合は二分法を使用します(数式を使用する巨人がいるようです。後でカンカンに行きます)。しかし、それを考えた後、233を分割する方法がわかりません(多分これが料理です)。ルートとルートの差の絶対値が> = 1であることがわかるまで、それは検索の間隔であることが判明しました...
実際、重要な点は、おそらく制御精度間隔の境界です
コードは、左の境界を判断し、2つのパーティション内で直接続行しようとします。もちろん、100が欠落していることがわかった場合は、100の特別な判断が行われます。
精度の鍵は二分法にあります。これは、左と右の間の最終距離が0.01未満になるため、upper_boundまたはlower_boundのどちらであるかを考慮する必要がないためです。直接ansは毎回左または右に切り替わります。

コード:

#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;

double f(double x){
	return a*x*x*x+b*x*x+c*x+d;
}

int main(){
	int cnt=0;
	double ans;
	double l,r,m,tmp1,tmp2;
	scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
	for(int i=-100;i<100;i++){
		l=i,r=i+1;
		tmp1=f(l),tmp2=f(r);
		if(!tmp1){
			printf("%.2lf ",l);
			cnt++;
			continue;
		}
		if(tmp1*tmp2<0){
			while(r>=l){
            	m=(l+r)/2;
				if(f(m)*f(l)<=0)r=m-0.0001,ans=m;
				else l=m+0.0001,ans=m;
			}
			printf("%.2lf ",ans);
			cnt++;
		}
		if(cnt==3)break;
	}
	l=100;
	if(cnt==2)printf("%.2lf ",l);
	return 0;
}
リリース9件のオリジナルの記事 ウォンの賞賛0 ビュー99

おすすめ

転載: blog.csdn.net/weixin_45497996/article/details/105364997