題目描述
夏天的重慶格外地炎熱,很容易**。消防士們都全副武裝,一旦發生險情就立馬趕往救火。森羅是消防隊中的一員,他在滅火的過程中突發奇想,如果能用退火的原理求解函式求最小值,那不就可以很容易計算了嗎?
翌日,森羅來到即將高考的弟弟家輔導功課,其中一道題目是這樣的函式
f(x) = f(x) = 7 * x7 + 6 * x6 + 2 * x3 + 8 * x2 - y * x
給定任意乙個實數y,讓你求出函式的最小值。森羅回想起昨天的突發奇想,很快就給出了這個題目的解。那麼,你知道他是怎麼解決的嗎?
輸入描述:
多組輸入
第一行輸入測試的樣例數量t
以後每一行輸入實數y的值。(0 < y < 1e10)
輸出描述:
每一行輸出函式的最小值(精確到小數點後四位)。
示例1輸入210
20輸出
-2.6256
-8.2788
備註:x為正實數(0這道題有兩種解法:三分及取巧
三分法一道解方程,很直接聯想到二分法,但這道題單調性不確定,直接二分肯定是會出問題的,那該如何解決呢?
用三分確定部分區間單調性。
①、通過 f(x) = 7 * x7 + 6 * x6 + 2 * x3 + 8 * x2 - y * x,預計可以判斷 f(x) 在 (0, 100] 的區間內,f(x) 應該是先遞減後遞增的。
我們可以通過比較 f((r+l)/2) 以及 f((r+mid)/2) 大小,找到在 x∈[mid, midd] 時,f(x) 的單調性。
大概模擬圖
實現**
#include
using
namespace std;
double y;
doublejs(
double x)
intmain()
printf
("%.4lf\n",js
(l));}
return0;
}
取巧法
觀察題目及備註我們可以發現,x 的變化範圍 (0, 100] 精度在 1e-4 上,100 * 104 = 106。若只有一組資料的話,完全是可以通過列舉 x 來找到最小值,但題目並沒有說明組數的多少,所以這樣的方法是有風險的。
儘量減少 pow 函式的使用!
儘量減少 pow 函式的使用!
儘量減少 pow 函式的使用!
為了使程式的效率更高,我們應當避免使用 pow 函式,直接用多個連乘來替代 pow 函式,否則也是不能通過全部測試樣例。
實現**
#include
using
namespace std;
double y;
doublef(
double x)
intmain()
return0;
}
三分法編寫**比較麻煩,通過測試樣例,需要 3 ms。
取巧法編寫**簡單,通過測試樣例,需要 237 ms。
兩種方法,各有所長…
基礎演算法題
1.一百萬富翁遇到一陌生人,陌生人找他談乙個換錢的計畫,計畫如下 我每天給你十萬,而你每天只需要給我一分錢,第二天我仍然給你十萬元,你給我二分錢,第三天我仍然給你十萬,你給我四分錢.你每天給我的錢是前天的兩倍,直到乙個月 30天 百萬富翁很高興,欣然接受拉這個契約.請編寫乙個程式計算這乙個月中陌生人...
演算法基礎題
程式1 題目 古典問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?1.程式分析 兔子的規律為數列1,1,2,3,5,8,13,21.程式2 題目 判斷101 200之間有多少個素數,並輸出所有素數。1.程式分析...
演算法基礎題(2)
程式5 題目 利用條件運算子的巢狀來完成此題 學習成績 90分的同學用a表示,60 89分之間的用b表示,60分以下的用c表示。1.程式分析 a b a b這是條件運算子的基本例子。程式6 題目 輸入兩個正整數m和n,求其最大公約數和最小公倍數。1.程式分析 利用輾除法。程式7 題目 輸入一行字元,...