標籤:style blog http color os 資料
【吐槽】:本來沒打算寫這題的題解的,但慘不忍睹得WA了13次,想想還是記錄一下吧。自己的“分類討論能力”本來就很差。
剛開始第一眼掃過去以為是LIS,然後忽略了複雜度,果斷TLE了,說起來也好慚愧,也說明有時候太懶得動腦了,總是習慣利用慣性思維,這不是一件好事。
【題意】:給你大小為n的整型數組a[n],求這數組的一個子串,其中最多可以修改子串中的一個數字,使得到的子串是最長的嚴格遞增的子串,輸出該子串的長度 L。
【思路】:O(n)複雜度,枚舉斷點情況。第0個和第n個位置預設為斷點。(用ve[i]表示第 i 個斷點在a[n]中的下標位置)
1、斷點 ve[i] 可更改,即斷點兩端數的差值大於1時,L 為前一個斷點到後一個斷點的距離,即 L = ve[i+1]-ve[i-1]。
2、斷點 ve[i] 不可更改,則這裡又分兩種情況:①由於從斷點開始左右兩側分別是嚴格遞增的,所以如果 a[ve[i]] - a[ve[i]-2] > 1,則表示 a[ve[i]-1] 可修改,
使得斷點前後兩段可以結合,L = ve[i+1]-ve[i-1]。
②如果不滿足①的情況,則取 ve[i]-ve[i-1] 和 ve[i+1]-ve[i] 中的較大值。
下面是AC代碼:
代碼下是測試資料
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 7 #define maxn 100006 8 int ant[maxn]; 9 int main()10 {11 int n;12 while(scanf("%d", &n) != EOF){13 vector<int> ve; ve.push_back(0);14 scanf("%d", &ant[0]);15 for(int i = 1; i < n; i++){16 scanf("%d", &ant[i]);17 if(ant[i]-ant[i-1] <= 0) { ve.push_back(i);}18 }19 ant[n] = -1;20 ve.push_back(n);21 22 int l = ve.size();23 int m, res = -1;24 25 if(l > 2)26 for(int i = 1; i < l-1; i++){27 if(ant[ve[i]+1] - ant[ve[i]-1] > 1){28 m = ve[i+1] - ve[i-1];29 }30 else if(ve[i-1] != ve[i]-1){31 if(ve[i] > 1&&ant[ve[i]]-ant[ve[i]-2] > 1) m = ve[i+1]-ve[i-1];32 else if(ve[i]-ve[i-1] > ve[i+1]-ve[i]) m = ve[i]-ve[i-1]+1;33 else m = ve[i+1]-ve[i]+1;34 }35 else { m = ve[i+1]-ve[i-1];}36 37 if(m > res) res = m;38 }39 else res = n;40 41 printf("%d\n", res);42 }43 }44 /*45 input:46 1147 7 2 6 4 3 1 8 10 24 31 2548 649 7 2 3 1 5 650 951 1 3 3 4 4 5 5 6 652 553 1 3 2 5 454 1155 7 2 6 4 3 3 8 10 24 31 2556 1057 1 3 2 2 4 6 9 3 7 258 5059 804289384 846930887 681692778 714636916 957747794 424238336 719885387 649760493 596516650 189641422 25202363 350490028 783368691 102520060 44897764 967513927 365180541 540383427 304089173 303455737 35005212 521595369 294702568 726956430 336465783 861021531 59961394 89018457 101513930 125898168 131176230 145174068 233665124 278722863 315634023 369133070 468703136 628175012 635723059 653377374 656478043 801979803 859484422 914544920 608413785 756898538 734575199 973594325 149798316 3866437160 1061 424238336 649760493 681692778 714636916 719885387 804289384 846930887 957747794 596516650 18964142262 1063 1 2 3 4 5 5 6 7 8 964 565 1 1 1 1 166 567 1 1 2 3 468 669 7 2 3 1 4 570 471 1 4 3 472 573 0 1 4 3 474 75 output:76 677 578 379 480 681 582 1983 984 685 286 587 488 489 590 */
View Code