hdu 2899
mxy终于学会求函数极值了。
先写一道板子。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef double db; 4 const db eps = 1e-6; 5 const db INF = 1e100; 6 const db delta = 0.98; 7 int sign(db k){ 8 if (k>eps) return 1; else if (k<-eps) return -1; return 0; 9 } 10 int cmp(db k1,db k2){return sign(k1-k2);} 11 int t;db y; 12 db get(db x){ 13 return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-y*x; 14 } 15 db x[10]; 16 db random(){ 17 return (rand()&1?1:-1)*rand()*1.0/32767; 18 } 19 void init(){ 20 for(int i=0;i<10;i++) x[i]=abs(random())*100; 21 } 22 db sa(){ 23 db ans = INF; 24 db t=100; 25 while (t>eps){ 26 for(int i=0;i<10;i++){ 27 db tmp = get(x[i]); 28 for(int j=0;j<10;j++){ 29 db _x=x[i]+random()*t; 30 if(cmp(_x,0)>=0&&cmp(_x,100)<=0){ 31 db f = get(_x); 32 if(tmp>f) 33 x[i]=_x; 34 } 35 } 36 } 37 t*=delta; 38 } 39 for(int i=0;i<10;i++) 40 ans=min(ans,get(x[i])); 41 return ans; 42 } 43 44 int main(){ 45 ios::sync_with_stdio(false); 46 scanf("%d",&t); 47 while (t--){ 48 scanf("%lf",&y); 49 init(); 50 printf("%.4f\n",sa()); 51 } 52 }