牛客練習賽72 C brz的序列(思維 凸殼)

2021-10-10 07:56:46 字數 1680 閱讀 7245

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 524288k,其他語言1048576k

64bit io format: %lld

巨佬 lzy\textlzy 閒來無事,給了蒟蒻 brz\textbrz 乙個長度為 n 的序列 a,並且允許蒟蒻操作這個序列,巨佬 lzy\textlzy 定義,一次操作要選定乙個 i∈(1,n)i\in(1,n)i∈(1,n),然後將序列中第 i 個數變成與它相鄰的兩個數的平均數,即 ai=ai−1+ai+12a_i=\dfrac +a_} 2ai​=2ai−1​+ai+1​​。

蒟蒻 brz\textbrz 想要將序列的總和變得最小,但是又不太會操作,也不敢在巨佬的面前吱聲,於是只好偷偷向你詢問:在可以進行無限次任意位置的操作的情況下,能得到的序列最小總和是多少?

第一行乙個整數n,表示序列長度。

第二行n個整數,表示這個序列。

1≤n≤106,1≤ai≤1091\leq n\leq 10^6,1\leq a_i\leq 10^91≤n≤106,1≤ai​≤109

輸出乙個實數,表示能得到的序列最小總和,保留到小數點後十位。
示例1

3

1 2 2

4.5000000000
操作一次序列的第二個數,使其變成1+2​=1.5,序列總和就是1+1.5+2=4.5,可以證明序列總和無法變得更小。
思路:

可以發現當乙個區間變成等差數列時就不能再變小了,問題進一步轉化為從原序列中選擇一些區間將其變為等差數列。

並不是任意區間變成等差數列時的和最小,只有除首尾以外的數都大於等差數列上對應的數時,原區間的和才會是最小值。

把序列中的數

#includeusing namespace std;

typedef long long ll;

const double eps = 1e-11;

const int n = 1e6 + 10;

int sgn(double x)

struct point

//定義運算

point(double _x, double _y)

bool operator == (point b) const

bool operator < (point b) const

point operator - (const point &b) const

double operator ^ (const point &b) const

} p[n], st[n];

int main()

int top = 0;

for(int i = 1; i <= n; ++i)

double ans = 0.0;

for(int i = 2; i <= top; ++i)

ans += 1.0 * (st[i].y + st[i - 1].y) * (st[i].x - st[i - 1].x + 1) / 2.0 - st[i].y;

ans += st[top].y;

printf("%.10f\n", ans);

return 0;

}

牛客練習賽9

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...

牛客練習賽15

時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 第一次期中考終於結束啦!沃老師是個語文老師,他在評學生的作文成績時,給每位學生的分數都是乙個小於10的非負小數。amy 8.99999999999999999999...

牛客練習賽5

給你n個正整數,n 5,每個正整數大小不超過1000,最初su m 0 sum 0 每次可將su m sum 按順序加上陣列中的數,加完之後可以對sum的數字進行全排列,求最終能達到的最大值。由於n只有5,所以按照題意模擬dfs實現就可以了,注意最後一組也可以按數字進行全排列。d題 include ...