貪心 陣列操作

2021-09-25 11:34:40 字數 2323 閱讀 3984

對於一道貪心題,關鍵是要證明,如果資料範圍給好一點,估計很容易想到貪心

因為資料有點大,直接處理可能會tle(雖然有人直接處理也過了,但秉著探索科學的心,我們來想想正解)

實際上我已經想過兩兩合併,但忽略了最長子段和跨越的情況

陣列操作

基礎題:

最大子段和

考慮直接掃瞄的過程遇到小於0就重新賦值為0,

則我們可以更新乙個陣列中間段的最大值(最大子段和)

當兩個陣列合併能產生最大值的時候,既滿足最大字首和和最大字尾和的值最大時可以更新最大值

然後我們考慮合併這兩個陣列,

最大字首和可以是後乙個陣列的最大字首和(從第二個陣列內不能從前往後選出和比最大字首和的和),也可以是前乙個陣列的字尾和(從第乙個陣列從後往前不能選出和比最大字尾和還大的值)

同理,分兩種情況討論

前乙個陣列最大子段和和後乙個陣列最大子段和,以及最大字尾和和最大字首和的和最大值

sums=sum[quq[1]][1],pre[0]=sum[quq[1]][0],pre[1]=sum[quq[1]][2],ans=max(sum[quq[1]][1],max(pre[1],pre[0]));

sumss=sum[quq[1]][3];

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

所以我們只需要維護最大字首和,最大字尾和,最大子段和

兩個陣列,因為直接掃瞄的時候可以直接更新乙個陣列的最大字首和,最大字尾和,最大子段和,陣列(方便更新)

所以合併的時候也要維護這3個值

ac**:

#include

using

namespace std;

const

int n=

51,l=

5010

,m=250010

;int n,m;

int quq[m]

;int sum[n][4

];int in[n]

[l];

int sums,pre[2]

,sumss;

intmain()

for(

int j=

1;j<=l;j++

) s=0;

for(

int j=l;j>=

1;j--

) s=0;

for(

int j=

1;j<=l;j++);

sum[i][1

]=max(sum[i][1

],s);}

}for

(int i=

1;i<=m;i++

)int ans;

sums=sum[quq[1]

][1]

,pre[0]

=sum[quq[1]

][0]

,pre[1]

=sum[quq[1]

][2]

,ans=

max(sum[quq[1]

][1]

,max

(pre[1]

,pre[0]

)); sumss=sum[quq[1]

][3]

;for

(int i=

2;i<=m;i++

)printf

("%d"

,ans)

;}

另乙份ac**(沒看題解寫的,調了很久)

因為最大子段和可以從任意位置開始,可以貪心策略,而最大字首和不可以從任意位置開始,所以小於0時不能重新賦值為0

#includeusing namespace std;

const int n=51,l=5010,m=250010;

int n,m;int quq[m];int sum[n][4];int in[n][l];

int sums,pre[2],sumss;

int main()

if(j==l)

}s=0;//分開求

for(int j=1;j<=l;j++)

}for(int i=1;i<=m;i++)

int ans;

sums=sum[quq[1]][1],pre[0]=sum[quq[1]][0],pre[1]=sum[quq[1]][2],ans=max(sum[quq[1]][1],max(pre[1],pre[0]));

sumss=sum[quq[1]][3];

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

printf("%d",ans);

}

過河問題 貪心 陣列

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...

貪心 數列極差

時間限制 1 sec 記憶體限制 128 mb 提交 9 解決 5 提交 狀態 討論版 命題人 add zmx 在黑板上寫了n個正整數組成的乙個數列,進行如下操作 每次擦去其中的兩個數a和b,然後在數列中加入乙個數a b 1,如此下去直至黑板上剩下乙個數,在所有按這種操作方式最後得到的數中,最大的為...

貪心 數列分段

時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 5 提交 狀態 討論版 命題人 add zmx 對於給定的乙個長度為n的正整數數列a i 現要將其分成連續的若干段,並且每段和不超過m 可以等於m 問最少能將其分成多少段使得滿足要求。輸入檔案的第1行包含兩個正整數n,m,表示了數列a ...