CF#FF(255)-div1-C【水題,枚舉】

來源:互聯網
上載者:User

標籤: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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.