poj 3737 UmBasketella 三分

水题一只。

已知 圆锥表面积 求最大体积  底面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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值