codeforces 157 div1(完全)

來源:互聯網
上載者:User

我是div2選手!!!

碰上了自己不擅長的數位DP,各種囧啊,前三題水的一逼,我還wa了一次,然後妥妥的掉分了

A題:

如果有零的話,去掉從左往右數的第一個0即可

B題:

這類題目以後要多多加強啊,這道題先預先處理出cnt[i],表示有i個lucky dig的數有多少個,這個過程用到了數位類DP的基本方法

處理出來後可以用一個dfs暴力求得答案

戳這裡看代碼

C題: 讓你構造一個序列,序列的最小公倍數就是這個序列中最大的數,而且每個數分別小於另一個序列,求可以構造多少個這樣的序列。 顯然,這個序列中除最大的那個外所有的數都是它的約數,所以可以枚舉這個最小公倍數,然後處理出所有的約數。然後問題就變成 : 將所有的約數放到n個位置(約數要小於等於所放位置的ai),可以重複 ,有幾种放法,注意,最大的那個也就是所枚舉的最小公倍數是一定要有一個位置放的。然後就這樣了

戳這裡看代碼

D題:

給你一個初始序列,然後有m個操作,每個操作會以0.5的機率交換兩個數,最後問你操作完成後這個序列逆序數的期望

試想如果知道了第i個數大於第j個數的機率,那麼只需要將所有的dp[i][j](i < j) 相加就是期望了。

設dp[i][j]表示第i個數大於第j個數的機率,初始化的時候序列是固定的,所以要麼為1,要麼為0. 對於每一個操作a b,會改變所有的dp[i][a] dp[a][i] dp[i][b] dp[b][i]  (i!=a&&i!=b) 也就是跟a b 有關的狀態,所以需要枚舉每一個i,如果不交換a b兩個位置的數,簡單,原來dp[a][i]的機率乘個0.5就好了, 如果交換  ,當前a位置的數就變成當前b位置的數了,那麼dp[a][i] = dp[a][i]
* 0.5 + dp[b][i] * 0.5(當前a位置的數從b位置拿過來的) ,就這樣,我還在位置與數值之間傻逼了半天了呢!

戳這裡戳這裡

E題:

比較常見的樹形結構轉換成線性結構用線段樹來做.

推薦兩個題
這題 和 那題

這個題的話需要記錄每個點和誰一起進行過操作,每次每個點單獨處理,將跟這個點一起操作的所有的鄰接點所代表的區間都放進線段樹,統計總點數的時候就相當於 的區間合并吧。

戳這裡看代碼

聯繫我們

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