三分

其实三分和二分实现是一样的,但是为什么我还要写一下呢,因为我没学的时候感觉太可怕了,学了后发现也就那样,所以我要记录一下(水题解)。

原题链接

每次三分取 \(x\) 判断大小。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=10005;
int t;
int n;
double a[N],b[N],c[N];
double f(double x,int i){
return x*x*a[i]+x*b[i]+c[i];
}
double check(double x){
double ans=0;
ans=f(x,1);
for(int i=2;i<=n;i++){
ans=max(ans,f(x,i));
}
return ans;
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
double l=0,r=1000,eps=1e-11,mid1,mid2;
while(r-l>eps){
mid1=l+(r-l)/3.0;
mid2=r-(r-l)/3.0;
if(check(mid1)>check(mid2)){
l=mid1;
}
else{
r=mid2;
}
}
printf("%.4lf\n",check(l));
}
int main(){
ios::sync_with_stdio(false);
cin>>t;
while(t--){
solve();
}
return 0;
}

这也是三分题

这个三分又和上面不一样(题解区里面的),但实际都差不多,都是三分取值。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=10005;
int t;
int n;
double a[N],b[N],c[N];
double f(double x){
double ans=0;
for(int i=0;i<=n;i++){
ans=ans*x+a[i];
}
return ans;
}
void solve(){
double l,r,eps=1e-7,mid;
cin>>n>>l>>r;
for(int i=0;i<=n;i++){
cin>>a[i];
}
while(r-l>=eps){
mid=(l+r)/2;
if(f(mid+eps)>f(mid-eps)){
l=mid;
}
else{
r=mid;
}
}
printf("%.5lf\n",r);
}
int main(){
ios::sync_with_stdio(false);
t=1;
while(t--){
solve();
}
return 0;
}
posted @   sad_lin  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示