對於一道貪心題,關鍵是要證明,如果資料範圍給好一點,估計很容易想到貪心
因為資料有點大,直接處理可能會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 ...