Cf 98 Div.2

來源:互聯網
上載者:User

又ak了一場 div2。。。


A題

給定一個CCPPCCPPCCCCCPPPP這樣的只有C,P的串,從左至右,每次最多取5個字元,每次取的字元必須相同,問最少要取多少次。

My Code比較短:

每次迴圈定個初始位置,以該位置的下一個位置開始for迴圈4次.

int main(){    int ans,i,n;    char ch[110];    while(cin>>ch){        n= strlen(ch);        ans=0;        int st=0;        while(st<n){            for(i=st+1;i<st+5 && i<n;++i){                if( ch[i]!=ch[i-1] )                    break;            }            ans++;            st= i;        }        cout<< ans <<endl;    }}

B題

給定一個序列n<= 5000,每個元素大小介於1到n之間,問至少需要改變多少個元素才能使序列中的元素是兩兩不同即1到n每個數字各出現一次。

超水,統計沒有出現的數位個數。


C題

給定最多100000個區間,保證座標x,y都是沒有重複的。問有多少個區間是被包含了。

水。。。

按x排升序,然後對於每個區間,看前面已經查詢過的區間的y的最大值,這個用一個變數儲存就可以了。

鄙視,數組開小了,看成了10000,另外,貌似sort直接對pair排序是預設以first作為第一關鍵字的。

pair<int,int>p[maxn];////// without this ,the code also get a Accepted,and the runtime is 90ms;   why;/*bool cmp(pair<int,int>x,pair<int,int>y){    return x.first< y.first;}*/int main(){    int n,i;    while(cin>>n){        for(i=1;i<=n;++i){            scanf("%d%d",&p[i].first,&p[i].second);        }        sort( p+1, p+1+n );        int ans=0,maxval= p[1].second;        for(i=2;i<=n;++i){            if( p[i].second < maxval )                ans++;            else                maxval= p[i].second;        }        cout<< ans <<endl;    }}

D題

給定長度為n的字串,n<=500,然後是k,要求把串劃分為 不多於k個段,可以是1,2,3..k段,要求每段是迴文串。     同時為了保證是迴文串,需要進行必要的修改字元操作,要求輸出最小的修改次數,即最後的結果串,段段之間用+號串連,如果多個答案,隨意輸出一個。

如:

abdcaba5

answer:

0a+b+d+c+aba

我的做法是dp,為了方便,我的字串從1開始到n作為索引,dp[i][j]:  [1,i] 劃分為 j段的最小修改次數,顯然dp[i][i] = 0;

dp[i][j]= min( dp[k][j-1]+ cal( i, i-k ));

cal( i, i-k ): 以i結尾長度為i-k的子串成為迴文串的最小修改次數。

cal()可以預先處理出來,cal(), 和DP都是 O( 500*500*500 )的複雜度,應該可以用dp最佳化;

同時為了記錄+號的位置,pos[i][j]: 表示dp[i][j]取得最優值時,i前面第一個+出現在哪個字元後後面。


E題

給定長度n<= 200000的串,要求最長的滿足v<= 2*c 的子串長度及相應的個數。v表示母音字母個數,c表示輔音字母個數;

我的考慮是 如果v[i] <= 2*c[i], 那麼用i更新ans,這是肯定的。

如果不滿足上式呢? 有 v[i] - v[j] <= 2* ( c[i]- c[j] ): ==> 2*c[j]- v[j] <= 2*c[i] - v[i];

也即我們需要找到比i前面 比 (2*c[i]-v[i]) 小或相等的 j,且取最小的那個,解決方案是以 2*c[i]-v[i] 作為索引,以i作為值建立線段樹維護最小值;

又考慮到 v[i] <= 2*c[i], 那麼用i更新ans , 建立線段樹是針對 v[i] > 2*c[i]的i,且值是負數,可以加上一個add= n+1;,這樣總區間是 

[ 1,n ],。

當然會有更方便寫的資料結構,我一時沒有想到。

具體見代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.