牛客プログラミングサミットS 1第2戦-青銅&白銀B-クレイジージェットコースター(暴力)

6884 ワード

リンク:https://ac.nowcoder.com/acm/contest/6219/B出典:牛客網
時間制限:C/C++5秒、その他言語10秒空間制限:C/C++262144 K、その他言語524288 K 64 bit IO Format:%lld
タイトルの説明
今日牛は遊園地に行ってジェットコースターを游びに行きました.彼はジェットコースターが坂を上り下りする过程がとても刺激的だと思って、家に帰ってから啓発されて、一つの问题を思い出しました.ジェットコースター全体の軌道を長さnの配列numとすると、ジェットコースターが坂を上るときの配列の値は増加傾向を示し、最高点になると配列の値は減少傾向を示し、牛はこのような増加後の減少法則に合致する配列をピラミッド配列と定義し、牛牛がnum配列全体の中で最も長いピラミッド配列を見つけてください.ピラミッド配列が存在しない場合は、0を出力してください.
例1入力4,[1,2,3,1]出力コピー4例2入力5,[1,5,3,1]出力3
コメント:
1<=n<=100000,000,num配列の数0<=num[i]<=100000.
テーマ:
ピラミッド配列の最大長を出力することが要求され、ピラミッド配列とは、まず厳格に増加し、それから厳格に減少することである.
問題解決の考え方:
2つの配列でメンテナンスし、1つの配列で表す:左の数が現在の数より小さいものはいくつか(連続でなければならない)、もう1つの配列で右の数が現在の数より小さいものはいくつか(連続でもある)を表し、それから0-nを遍歴し、aiとbiが0でなければ、この数が塔頂であることを説明し、ans=max(ai+bi+1、ans)で答えを維持することができる.ACコード:
class Solution {
public:
    /**
     *
     * @param n int  
     * @param num int  vector
     * @return int  
     */
    int a[1000050],b[1000050];
    int getMaxLength(int n, vector<int>& num) {
    memset(a,0,sizeof a);
    memset(b,0,sizeof b);
    for(int i=1;i<n;i++)//               
      if(num[i]>num[i-1])
        a[i]=a[i-1]+1;
    for(int i=n-2;i>=0;i--)//                
      if(num[i]>num[i+1])
        b[i]=b[i+1]+1;
    int ans=0;
    for(int i=0;i<n;i++)
      if(a[i]&&b[i])//    
        ans=max(ans,a[i]+b[i]+1);
    return ans;
    }
};