三分法要注意本题函数是下凹函数还是上凸函数
hdu4355
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 50010
double p[N],w[N];
int n;
double cal(double mid){
int i;
double ans=0;
for(i=1;i<=n;i++){
double err=fabs(mid-p[i]);
ans+=w[i]*err*err*err;
}
return ans;
}
int main(){
int t,T;
int i;
scanf("%d",&T);
for(t=1;t<=T;t++){
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lf %lf",&p[i],&w[i]);
double l=-1000000,r=1000000;
while(r-l>1e-4){
double ll=(l*2+r)/3;
double rr=(l+r*2)/3;
double ans1=cal(ll);
double ans2=cal(rr);
if(ans1>ans2)
l=ll;
else
r=rr;
}
printf("Case #%d: %.0lf\n",t,cal(l));
}
}
hdu 2438
公式推的比较复杂,主要得看出汽车和拐弯出的水平线交点位置的变化,随着拐弯幅度变大,交点位置先变大后变小。
#include<cstdio>
#include<cmath>
using namespace std;
double x,y,l,r;
double cal(double mid){
return (l*sin(mid)+r/cos(mid)-x)/tan(mid);
}
int main(){
while(scanf("%lf %lf %lf %lf",&x,&y,&l,&r)==4){
double s=0,t=asin(1.0);
while(t-s>1e-9){
double ll=(s*2+t)/3;
double rr=(s+t*2)/3;
if(cal(ll)<cal(rr))
s=ll;
else
t=rr;
}
if(cal(s)>y)
printf("no\n");
else
printf("yes\n");
}
return 0;
}