基礎演算法題 炎炎消防隊(取巧 三分)

2021-10-10 07:25:14 字數 1671 閱讀 9874

題目描述

夏天的重慶格外地炎熱,很容易**。消防士們都全副武裝,一旦發生險情就立馬趕往救火。森羅是消防隊中的一員,他在滅火的過程中突發奇想,如果能用退火的原理求解函式求最小值,那不就可以很容易計算了嗎?

翌日,森羅來到即將高考的弟弟家輔導功課,其中一道題目是這樣的函式

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 題目 輸入一行字元,...