题解 UVA1555 【Garland】(二分)
生活随笔
收集整理的這篇文章主要介紹了
题解 UVA1555 【Garland】(二分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題面
最近有人問我這個題這么做,光講幾句貌似沒什么用,干脆發個題解吧(話說什么有人會來問我這個蒟蒻)
題面的意思大概就是說每個點的高度都和旁邊2個點有關,整張圖沒有高度小于0的點,求最后一個點B的最低值
是不是長得像個數學題?所以我們用數學的方法來思考一下Hi怎么得出。
題目中說過,Hi = (H[i?1] + H[i+1])/2-1,也就是已知旁邊的2個點,就可以求出中間的點2,因為表達式已知,所以我們可以通過其中2個點求出第3個點。
簡單地推一推:設第1個點為a,第2個點為b,第3個點為c,已知a,b。
∵b=(a+c)/2-1;
∴2b+2=a+c
∴2b+2-a=c
這樣一來,我們就可以通過前面的點直接推出后面的點了!所以我們就只需要找出使B最低并且每個點都>=0的第2個點就可以了qwq
現在我們已經知道了B點的高度和第2點相關了,但是要求出B的最低的值,該怎么確定第2個點的值呢?
遇到這種在條件中求最值問題,首先想到的肯定是二分。因為二分可以不斷地縮小查找范圍,最終縮小到不滿足條件與滿足條件之間,也就是最浪小的值了。
細節部分直接看代碼:
#include<bits/stdc++.h> using namespace std; const double mina=1e-6; int n; double a,l,r,mid,lp[1010]; bool judge(double x)//每次二分暴力的判斷一下是否有點小于0 {lp[1]=a;lp[2]=x;for(int i=3;i<=n;i++){lp[i]=2*lp[i-1]-lp[i-2]+2;if(lp[i]<0)return false;}return true; } int main() {while(scanf("%d%lf",&n,&a)!=EOF)//scanf是有返回值的,返回讀入的個數,如果沒有的話返回EOF{ for(int i=0;i<=1009;i++)lp[i]=0.00;l=a/2-1;//這里可以優化一下二分的范圍,因為這個值剛好使第3個點為0r=a;//隨便設個高一點的值即可while(r-l>mina)//保證精度{mid=(l+r)/2;if(judge(mid)==true)r=mid;//滿足的話就可以再小一點else l=mid;//不滿足的話就增大}printf("%0.2lf\n",fabs(lp[n]));getchar();//讀走回車} return 0; }//看懂了記得點贊QWQ轉載于:https://www.cnblogs.com/Lemir3/p/10327668.html
總結
以上是生活随笔為你收集整理的题解 UVA1555 【Garland】(二分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 获取文件夹下所有文件
- 下一篇: 过河卒(Noip2002)