POJ 2018 斜率優化DP

2021-08-07 04:31:59 字數 1234 閱讀 4533

給一堆數,選不少於f個數的子串行,求均值最大的子串行。

最原始的斜率dp優化題目,最初出現在周源的國家隊**中。儘管這個題是最原始的題,但是這個題並不能用常用的套路。這個題的狀態轉移方程很明顯,但是卻不是標準的斜率優化方程(當然也差不多)。優化的話,基本上還是老套路,用乙個單調佇列進行優化。在選擇最優元素的時候,對斜率進行判斷,如果下乙個點組成的斜率更大,那麼將選擇下乙個元素。在插入元素的時候,也對斜率進行判斷,保證斜率是單調遞增的。

其實也沒有太多需要注意的,主要就是這種題的乙個老套路。迴圈要從f(限制大小)開始。原因也很簡單,如果從1開始的話,那樣就會產生個數小於f的子串行,從而可能導致平均數偏大。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define up(i,l,h) for(int i=l;i#define down(i,h,l) for(int i=h-1;i>=l;i--)

#define w(a) while(a)

#define mem(a,b) memset(a,b,sizeof(a))

#define ll long long

#define inf 0x3f3f3f3f

#define maxn 800010

#define mod 1000000009

#define eps 1e-3

using

namespace

std;

int sum[100010],q[100010];

double check(int a,int b)

int main()

int st=0,ed=0;

q[ed++]=0;

double ans=0;

up(i,f,n+1)

ans=max(ans,check(q[st],i));

// coutw(st+1

1],k)<=check(q[ed-2],q[ed-1]))

q[ed++]=k;

}printf("%d\n",int(ans*1000));

}}

poj2018 斜率數形結合

題意 給定乙個長度為n的陣列,求其中長度大於等於k的連續的一段,使其算數平均值最大。輸出最大平均值 1000取整的結果。斜率斜率斜率。大致感覺可以用斜率來做。我試了試把最優決策的選擇化成斜率的式子,但發現這本來就是斜率的式子,於是就不知道怎麼弄了。何老師講的類似分數規劃的方法來做。但是我覺得斜率也應...

poj2018(高精度二分 dp)

題意 給你n個數,要你在這n個數裡面找到一些連續的數,這些數的數量大於等於m,並且他們的平均值在這n個數裡面是最大的.思路 先把n個數的最大最小值確定,然後二分列舉平均值,對於每乙個連續數,只要他們減去平均值大於0,就調製上限制,不然調整下限制,include include includeusin...

poj2018(高精度二分 dp)

題意 給你n個數,要你在這n個數裡面找到一些連續的數,這些數的數量大於等於m,並且他們的平均值在這n個數裡面是最大的.思路 先把n個數的最大最小值確定,然後二分列舉平均值,對於每乙個連續數,只要他們減去平均值大於0,就調製上限制,不然調整下限制,include include includeusin...