Codeforces Round #FF(255) DIV2 C - DZY Loves Sequences

來源:互聯網
上載者:User

標籤:style   blog   http   color   strong   os   

A - DZY Loves Hash

水題,開闢一個數組即可

#include <iostream>#include <vector>#include <algorithm>#include <string>using namespace std;int main(){    int p,n;    cin >> p >> n;    vector<bool> buckets(302,false);    bool flag = false;    vector<int > x(n);    for(int i  =0  ; i < n ; ++i) cin >> x[i];    int i = 0;    for(i = 0 ; i < n; ++i){        if(!buckets[x[i]%p]) buckets[x[i]%p] = true;        else{ cout<<i+1<<endl; break;}    }    if(i >= n) cout<<-1<<endl;}
開闢一個數組即可B - DZY Loves Strings

先把給定的字元的值求出來,然後插入權重最大的值即可

#include <iostream>#include <vector>#include <algorithm>#include <string>#include <map>using namespace std;int main(){    string s;    int k;    vector<int> w(26,0);    cin >>s >> k;    for(int i = 0 ; i < 26; ++ i) cin >>w[i];    long long res = 0;    for(int i = 0 ;i < s.length(); ++ i){        res+=w[s[i]-‘a‘]*(i+1);    }    sort(w.begin(),w.end());    for(int i =s.length(); i < s.length()+k; ++ i){        res+=w[25]*(i+1);    }    cout<<res<<endl;}
View CodeC - DZY Loves Sequences

題目的意思是給定一個序列,然後找出一個子序列,改變子序列的一個值,使該子序列嚴格單調遞增,求出滿足上述要求最長子序列的長度。

注意一定要是單調遞增

思路是將數組分塊,每一塊都是嚴格單調遞增的

如 7 2 3 1 5 6

分組後為 [7], [2,3], [1,5,6],影響長度的是組與組之間的間隔

現在記錄下每一個組的開始索引和結束索引,以及長度,所求最大子序列長度有三種可能

(1)如果該數組只有一個分組,則該長度就是所求結果的長度

(2)max(每個分組的長度+1),即就是每個分組的長度+改變與其相鄰元素的值的最大值

(3)兩個分組合并後的值即max(分組 i + 分組 i+1 )的值,注意這裡分組有兩種情況種情況

    假設分組後兩組元素為[astart1 .... aend1], [astart2 ..... aend2],注意這兩組元素是相鄰的即 start2 == end1+1

    要滿足嚴格單調遞增的情況必須滿足 astart2+1-aend1 > 1 或者 astart2 - aend1-1 >1, 要像下面的用例一樣[1,2,5],[4,5,7]即可

    如果下面的用例

      a、[1,2,4],[3,6,7]這兩個分組無法合并 ,因為astart2 -aend1-1 <=1

      b、[1,2,5],[3,5,7]這兩個分組無法合并, 因為astart2+1-aend1 <=1

#include <iostream>#include <vector>#include <algorithm>#include <string>using namespace std;struct Node{    int startIdx;    int endIdx;    Node(int a = 0,int b = 0): startIdx(a),endIdx(b){};    int getLength(){return endIdx-startIdx+1;}};int main(){    int n;    cin >>n;    vector<int> a(n+1,0);    vector<Node> aux;    for(int i = 1;i <=n ; ++i) cin >> a[i];    int startIdx = 1, maxLength = 0;    bool flag = false;    for(int i = 1; i < n ; ++i){        if(a[i] < a[i+1]){            if(!flag) {startIdx = i;flag = true;}        }else{            aux.push_back(Node(startIdx,i));            maxLength = max(maxLength,i-startIdx+1);            startIdx = i+1;            flag = false;        }    }    if(startIdx == n ) {aux.push_back(Node(n,n));maxLength = max(maxLength,1);}    else {aux.push_back(Node(startIdx,n));maxLength=max(maxLength,n-startIdx+1);}    for(int i = 0; i < aux.size()-1; ++ i){        if(aux[i+1].startIdx+1<=aux[i+1].endIdx && a[aux[i+1].startIdx+1]-a[aux[i].endIdx] > 1) maxLength =max(maxLength,aux[i+1].getLength()+aux[i].getLength());        if(aux[i].endIdx-1>=aux[i].startIdx && a[aux[i+1].startIdx]-a[aux[i].endIdx-1] > 1 ) maxLength =max(maxLength,aux[i+1].getLength()+aux[i].getLength());        maxLength =max(maxLength,aux[i].getLength()+1);    }    if(aux.size() > 1)  maxLength =max(maxLength,aux[aux.size()-1].getLength()+1);    cout<<maxLength<<endl;}
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.