日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

题解 UVA1555 【Garland】(二分)

發布時間:2025/7/25 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 题解 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】(二分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。