1007: 嚴格遞增連續子段 [模擬]
時間限制: 1 sec 記憶體限制: 128 mb
提交: 150 解決: 12
題目描述
給定乙個有n
個正整數組成的序列,你最多可以改變其中乙個元素,可以修改為任意的整數。問可以得到的嚴格遞增連續子段的最大長度。
輸入第一行輸入乙個整數t
,代表有t
組測試資料。
每組資料佔兩行,第一行輸入乙個整數n
,代表元素個數。
下面一行有n
個正整數ai(ai<231)
。注:1<=t<=100,1<=n<=100000。輸出
對每組測試資料輸出乙個整數代表可以得到的嚴格遞增連續子段的最大長度。
樣例輸入24
1 2 3 4
41 2 2 4
樣例輸出44
提示第一組資料已經是嚴格遞增連續子段了,不需要修改。
第二組資料可以將第三個元素修改為3,這樣可以得到長度為4的嚴格遞增連續子段。**
題意:》
思路:模擬陣列,判斷三種特殊情況:
1: 兩個遞增子串行中間相隔乙個元素,且前乙個序列的尾元素與後乙個序列的首元素差值大於1,那麼這個子串行的長度為兩段長度之和加一;
2:兩個遞增子串行中間沒有隔元素,且前乙個序列的尾元素和後乙個序列的首元素差值大於一,那麼這個子串行的長度為兩段長度之和;
3: 不滿足上述兩種情況,那麼它的長度就是他本身;
值得注意的是第二種情況我們要遍歷兩邊;
下面附上**:
#includeusing namespace std;
const int m=100005;
int a[m],b[m],c[m],d[m];//a陣列為原序列,b陣列記錄遞增序列的首元素,c陣列記錄遞增序列的尾元素
int main()//d陣列記錄遞增子串行的長度
{ int n,t;
cin>>t;
while(t--)
{ int ans=1,top=0,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i1)
sum=max(sum,d[i-1]+d[i+1]+1);
for(int i=2;i<=top;i++)//比較前一遞增段的末元素和後乙個遞增段第二元素的大小(從後一段往前一段比較)
if(d[i]>1)
if(a[b[i]+1]-a[c[i-1]]>1)
sum=max(sum,d[i]+d[i-1]);
for(int i=1;i1)
if(a[c[i]-1]+1
嚴格遞增連續子段 模擬
時間限制 1 sec 記憶體限制 128 mb給定乙個n 個正整數組成的序列,你最多可以改變其中乙個元素,可以修改為任意的整數。問可以得到的嚴格遞增連續子段的最大長度。第一行輸入乙個整數t 代表有 t組測試資料。每組資料佔兩行,第一行輸入乙個整數n 代表元素個數。下面一行 n個正整數ai ai 2 ...
PAT A1007 最大連續子串行和
給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大連續子串行和即為20。輸出最大和以及n i n j 如果有多種方案使得和最大,那麼輸出其中i,j 最小的一組 如果所有整數均為負數,則最大子串行和...
pat 1007(dp 最大連續子列和)
pat 1007 思路 這題以前做對過,這次又改了幾遍才對。tp記錄子列和,mx記錄最大子列和,如果tp 0,就更新捨棄前面的,即tp 0,如果tp mx就更新mx,同時更新座標就行了。1 初始時,pos 1,pos是記錄mx的最靠前部分的前乙個數字的id。2 更新tp與更新mx之間是else if...