题意
圆柱,有盖,表面积1000平方厘米,已知容积(体积),求最小底面半径(小数点后一位),无解输出NO
思路
这是数学题???
- 列公式化简:V=500r-πr3,有解即f(x)=500x-πx3-V与x轴有交点
- 求导判断单调性,导数500-3πx2,知道f(x)先单调增加,在x=(500/3π)1/2处取到极大值,后单调递减
①如果代入V和极大值,f(x)<0,则无解
②f(x)>=0则有解,x从极大值点向左按0.01递减,直到出现f(x)<0,x+0.01即为所求的最小半径
我发现隔壁人家枚举直接举出来了!!!!!
我到底为什么要求导!!!!!
笔记
- 我竟然不会解一元三次方程(……)
- 一开始用0.1,精度不够,1000算出来2.0,就把递减值改小了
- 一直在纠结f=0的情况,可是实际上这个都是double的,各种小数,很难等0吧,只要精确度够小估算值应该都能通过测试
代码
#include<cstdio>
#include<math.h>
double pi=acos(-1);
int main(){
double x, max, f;
int V, k;
scanf("%d", &k);
max = sqrt(500.0/(3*pi));
while(k--){
scanf("%d", &V);
f = 500*max - pi*pow(max, 3.0) - V;
if(f<0){
printf("NO\n");
continue;
}
for(x=max-0.001; f>0; x-=0.001)
f = 500*x - pi*pow(x, 3.0) - V;
printf("%.1f\n", x+0.001);
}
return 0;
}