牛客競賽每日一題3 27 數學考試 動態規劃

2021-10-04 10:38:14 字數 1780 閱讀 2257

雖然說是動態規劃實則就是在暴力找答案。

我們答案要求的是兩個區間,所以我們只要選取乙個區間,然後列舉這個區間往前的所有區間能提供的最大答案就好了。

我們需要什麼呢value[i] , 區間的最後位置是i,這個區間的權值總和.

這個value可以用字首和輕鬆算。

下乙個就是fmax[i],代表的是[1,i]這些位置能構成的最大區間權值然後答案明顯就是

ans =

max(ans, value[i]

+ fmax_[i - k]

);

當我們寫出value陣列後就可以直接寫出fmax陣列了。

綜上所述複雜度是o(n)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define int long long

#define double long double

using

namespace std;

#define pi 3.1415926535898

#define eqs 1e-17

const

long

long max_ =

200000+7

;const

int mod =

1e9+7;

const

int inf =

1e9+7;

const

long

long inf =

1e18

;int

read()

while

(ch >=

'0'&&ch <=

'9')

return s * f;

}inline

void

write

(int x)

if(x >9)

write

(x /10)

;putchar

(x %10+

'0');}

inline

intmin

(int a,

int b)

inline

intmax

(int a,

int b)

int tree_[max_]

,value[max_]

,n,k,sum[max_]

,fmax_[max_]

;signed

main()

memset

(value,

128,

sizeof

(value));

for(

int i =

1+ k -

1; i <= n; i++

) fmax_[1]

= value[1]

;for

(int i =

2; i <= n; i++

)//value[i], 以i為結尾的權值

int ans =

-inf;

for(

int i =

2* k; i <= n; i++

) cout << ans << endl;

}return0;

}

牛客 NC15553 數學考試

思路 先把字首和求出來.類似於dp,當前節點為i的時候,我們要記錄下i之前的連續k個數和的最大值lmax.這就是第一段 然後讓j i k,讓rmax a j a i 這樣然後max max max,lmax rmax 這樣的複雜度是o n 看 include include include incl...

數碼 牛客每日一題

題意 給定兩個整數 l 和 r 對於所有滿足 1 l x r 10 9 的 x 把 x 的所有約數全部寫下來。對於每個寫下來的數,只保留最高位的那個數碼。求1 9每個數碼出現的次數。思路 可以轉化為1到 r 的問題,列舉約數 a,找到有多少約數 b,使得 a b 在1 到 r 的範圍內。統計數量。a...

牛客每日一題 保護花

題目連線 這個很明顯是貪心,推導一下公式 假設這一群牛中有a b這兩頭,他們的值分別是ati adi,bti bdi,並且已經知道了總的di值sdi 假設先運a牛就是比先運b牛好,說明先運a牛總的損壞低 則有 sdi adi 2 ati sdi bdi 2 bti 可以發現當 adi 越高 ati越...