水题一只。
已知 圆锥表面积 求最大体积 底面r 和 高
推公式。 r^2 = s^2/( h^2*PI^2 + 2*PI *s )
v = 1/3 *PI Ir^2 *h
发现 公式是分数形式 上边是常数, 下边是对钩 函数 a*x + b/x 的格式。 分析单调性 。直接求导 出结果 或者 三分
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <cstring>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <assert.h>
#include <queue>
#define REP(i,n) for(int i=0;i<n;i++)
#define TR(i,x) for(typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define ALLL(x) x.begin(),x.end()
#define SORT(x) sort(ALLL(x))
#define CLEAR(x) memset(x,0,sizeof(x))
#define FILLL(x,c) memset(x,c,sizeof(x))
using namespace std;
const double eps = 1e-9;
#define LL long long
#define pb push_back
const int maxn = 21000;
double a[maxn];
const double PI = 3.1415926;
double s;
int main(){
while(~scanf("%lf",&s)){
double h = sqrt(2*s/PI);
double r = sqrt(s*s/(h*h *PI* PI + 2*PI*s));
double v = PI*r*r*h/3;
printf("%.2lf\n",v);
printf("%.2lf\n",h);
printf("%.2lf\n",r);
}
return 0;
}
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <cstring>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <assert.h>
#include <queue>
#define REP(i,n) for(int i=0;i<n;i++)
#define TR(i,x) for(typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define ALLL(x) x.begin(),x.end()
#define SORT(x) sort(ALLL(x))
#define CLEAR(x) memset(x,0,sizeof(x))
#define FILLL(x,c) memset(x,c,sizeof(x))
using namespace std;
const double eps = 1e-9;
#define LL long long
#define pb push_back
const int maxn = 21000;
double a[maxn];
const double PI = 3.1415926;
double s;
double f(double h){
return s*s*PI/(h*PI*PI + 2*PI*s/h)/3;
}
int main(){
while(~scanf("%lf",&s)){
double left = 0.1;
double right =1000000;
while(right - left >1e-6){
//cout << left << " "<<right << f(left)endl;
double lmid = (left +right )/2;
double rmid = (lmid + right)/2;
if(f(lmid) < f(rmid)){
left =lmid ;
}else{
right = rmid;
}
}
double h= left ;
double r = sqrt(s*s/(h*h*PI*PI + 2*PI*s));
double v = PI*r*r*h/3;
//cout << f(4.37)<<endl;
printf("%.2lf\n",v);
printf("%.2lf\n",h);
printf("%.2lf\n",r);
}
return 0;
}
以上代码 由于 浮点数问题 c++ AC , 把 %.2lf 该成 %.2f G++ 也可AC