P2085 最小函式值

2022-08-13 01:27:26 字數 1051 閱讀 6845

題目給你\(n\)個二次函式,給你\(a\),\(b\),\(c\)。

不過仔細的話可以發現:這三個係數都是正整數!

所以意味著二次函式的對稱軸在x軸負半軸,在我們考慮的\([1, +\infty]\)中的整數區間都是單調遞增的。

所以同乙個函式中,\(x=1\)時的函式值是最小的。

如何求目標值?下面給出演算法。

對於每個函式,是不是有乙個單調答案序列:\(a_i \times 1^2 + b_i \times 1 + c_i\), \(a_i \times 2^2 + b_i \times 2 + c_i\)...\(a_i \times \infty^2 + b_i \times \infty + c_i\)

對於總共\(n\)個函式,就有這麼\(n\)個單調序列。

我們的做法是將所有的單調序列中的最小元素入隊。

然後每一次取出優先佇列中最小的元素出來,這個元素就計入答案,被我們輸出。

我們可以補充乙個數,就是相同序列的下乙個元素。例如出隊了\(x=1\)的元素,就補充同個序列的\(x=2\)進去。

這樣做的話保證優先佇列中是穩定的\(n\)個元素。

不知道怎麼證明。。。

實現過程中,堆肯定用priority_queue實現啦。只不過其中元素可以自定結構體方便寫。

**:

#include#include#includeconst int maxn = 10005;

int n, m;

int a[maxn], b[maxn], c[maxn];

struct nodes

};std::priority_queueq;

int f(int i, int x)

int main()

for(int i = 1; i <= n; i++) q.push((nodes));

for(int t = 1; t <= m; t++)

);if(t != m) printf(" ");

}printf("\n");

return 0;

}

P2085 最小函式值

有n個函式,分別為f1,f2,fn。定義fi x ai x 2 bi x ci x n 給定這些ai bi和ci,請求出所有函式的所有函式值中最小的m個 如有重複的要輸出多個 輸入格式 輸入資料 第一行輸入兩個正整數n和m。以下n行每行三個正整數,其中第i行的三個數分別位ai bi和ci。ai 10...

P2085 最小函式值

題目鏈結hhh 好嘛,運氣真好,剛a掉序列合併,正好碰到這題,可以說是序列合併的公升級版了 那麼簡單說一下思路,首先,最小值肯定出在當x 1的情況下的n個值中,那麼將x 1的情況全部扔進小根堆裡並用結構體確定最小值的下標,那麼在呼叫此下標時,x就要加一,並出堆,實現 如下 1 include2 in...

P2085 最小函式值 堆

題目描述 有n個函式,分別為f1,f2,fn。定義fi x aix 2 bix ci x n 給定這些ai bi和ci,請求出所有函式的所有函式值中最小的m個 如有重複的要輸出多個 輸入格式 輸入資料 第一行輸入兩個正整數n和m。以下n行每行三個正整數,其中第i行的三個數分別位ai bi和ci。ai...