我们都知道ycb老师是一个阳刚的人,不仅如此,ycb老师还是一个很很绅士的人,一天他看到一个妹子被一个箱子挡住了路,于是他想移动这个箱子,帮助妹子清理路障,但是要是用力过猛会的话,ycb老师怕妹子认为自己是一个粗鲁的人,于是他想知道最小移动箱子的力是多大?
PS:忽略转动 , 地面水平,箱子看成质点,G=9.80665m/s^2,请注意是移动箱子(滑稽.jpg)。
第一行输入m,n , m表示物体质量,n表示物体与地面摩擦系数 (0=<m,n<1e7)
最小移动箱子的力F,保留6位小数 (printf("%.6f\n",ans);)
1 0
0.000000 题目中说明了 要移动箱子,所以你可以按任意方向去 拉 或者去 拖 箱子,根据受力分析,得到F = umg/(u*sina+cosa) ,题目中要实现移动箱子的最小力量,所以需要求 u*sina+cosa 的最大值,根据高中物理知识,自己完全知道是多少, 但是如果忘记了,那我们就用正确的方法来解决,需要先用三分搜索求得最大值 三分搜索见上篇,有int 和double 两种写法,此题目中需要输出小数,所以需要用到double型的三分搜索,#include <iostream> #include <stdio.h> #include <math.h> using namespace std; const double g = 9.80665; const double pi = acos(-1.0); const double eps = 1e-8; double m,n; double f(double a) { return n*sin(a)+cos(a); } double thsearch() { double l=0,r=pi*0.5; while(r-l>=eps) { double mid,mmid; mid=(l+r)/2; mmid=(mid+r)/2; if(f(mid)>f(mmid)) r=mmid; else l=mid; } return n*m*g/f(l); } int main() { scanf("%lf%lf",&m,&n); double len = thsearch(); printf("%.6f\n",len); } 需要注意的是,double有精度误差,所以选择eps的时候,尽量选择小的,如此题目中的1e-8,若是1e-6在此题目中是错误的, 所以选择尽量的小的数。 反正没有多大影响。