ZOJ -3203 三分+数学
生活随笔
收集整理的這篇文章主要介紹了
ZOJ -3203 三分+数学
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
給出光的高度,人的高度,還有屋子的寬度
本題就是要求人站在什么地方影長最長 輸出最長的影長
數學題
可以把這道題的分段公式推出來
然后分類討論x在不同的范圍獲得不同的大小
或者把影長公式推出來
發現是凸函數 可以求極值點 然后三分求
三分
#include<bits/stdc++.h> using namespace std; const double eps = 1e-9; double H,h,D; double cal(double x) {return -x-D*(H-h)/x+H+D; } int main() {int n;cin>>n;for(int i=1;i<=n;i++){cin>>H>>h>>D;double l = D-(D*h)/H,r=D;cout<<l<<" "<<r<<endl;while(r-l>eps){double mid = (l+r)/2;double mmid = (mid+r)/2;if(cal(mid)>=cal(mmid))r = mmid;elsel = mid;// 無論怎么消除區間 都會使l和r向最高值靠攏// 即便是l和r在一側 那么也會淘汰較小的那部分區間 想更精確與極值點處靠攏}printf("%.3lf\n",cal(r));}return 0; }公式:
#include<bits/stdc++.h> using namespace std; const double eps = 1e-9; double H,h,D; double cal(double x) {return -x-D*(H-h)/x+H+D; } int main() {int n;cin>>n;for(int i=1;i<=n;i++){cin>>H>>h>>D;double leak = sqrt(D*(H-h));//峰值xdouble x0 = D-D*h/H;//分段函數臨界點xif(leak<=x0)//當峰值x小于臨界點時 直接表示出最高值printf("%.3lf\n",h*D/H);else if(leak>=x0&&leak<=D)//當峰值x在D與臨界點之間時是兩段影長相加printf("%.3lf\n",cal(leak));else printf("%.3lf\n",h);// 當對號函數峰值x大于D時 表示//最大的影長需要在場外獲得此時人站在盡可能靠近此峰值出的位置 可以獲得//盡可能大的影長 所以直接輸出h}return 0; }總結
以上是生活随笔為你收集整理的ZOJ -3203 三分+数学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Leetcode][第35题][JAV
- 下一篇: H5网页漫画小说苹果cms模板源码/支持