[USACO19JAN,Platinum] Redistricting
[USACO19JAN,Platinum] Redistricting
這道題A了才知道。。并不難a! orz
題目
內(nèi)存限制:128 MiB
時(shí)間限制:1000 ms
題目描述
奶牛們的最大城市Bovinopolis正在重新劃分勢(shì)力范圍—生活在那里的主要是兩個(gè)品種的奶牛(Holsteins和Guernseys),他們之間始終都有爭(zhēng)執(zhí),因?yàn)閮煞N奶牛都希望自己能在Bovinopolis的政府中保持足夠的影響力。
Bovinopolis的大都市區(qū)域由N(1≤N≤3*1e5)個(gè)牧場(chǎng)組成,每個(gè)牧場(chǎng)包含一頭奶牛,她可以是Holsteins,也可以是Guernseys。
Bovinopolis政府希望將大都市區(qū)劃分為若干個(gè)相鄰的區(qū)域,每個(gè)區(qū)域最多包含K個(gè)牧場(chǎng)(1≤K≤N),每個(gè)牧場(chǎng)都恰好只包含在一個(gè)區(qū)域內(nèi)。由于目前Bovinopolis政府由Holsteins牛控制,因此,他們希望找到一種重新劃分的方法,使得Guernseys牛占多數(shù)或兩種牛相當(dāng)?shù)膮^(qū)域盡可能的少(如果Guernseys的數(shù)量和Holsteins的數(shù)量相同,則認(rèn)為是兩種牛相當(dāng))。
有一個(gè)關(guān)心政治的Guernseys牛的聯(lián)盟想知道政府的計(jì)劃會(huì)對(duì)她們?cè)斐啥嗌俚膫?#xff0c;希望你幫助她們計(jì)算出Guernseys牛占優(yōu)或?qū)嵙ο喈?dāng)?shù)膮^(qū)域最小可能的數(shù)量。
輸入格式
第一行輸入2個(gè)數(shù)字N和K,表示牧場(chǎng)的數(shù)量和每個(gè)區(qū)域最多的牧場(chǎng)數(shù)。
第二行輸入N個(gè)只包含H和G的字符串,表示第i個(gè)牧場(chǎng)由Holsteins牛或Guernseys牛控制的牧場(chǎng)。
輸出格式
輸出Guernseys牛占優(yōu)或均勢(shì)的最小分區(qū)數(shù)量。
樣例
樣例輸入
7 2
HGHGGHG
樣例輸出
3
題解
首先一個(gè)長(zhǎng)度為k的區(qū)間,可以劃分為1和k-1,2和k-2…k,很多種選擇,
而在這中間每一種選擇都會(huì)影響答案,
而且與前面一次選擇后k具體在哪個(gè)到哪個(gè)區(qū)間有關(guān)系
那么這道題就很容易想到DP了,而且長(zhǎng)得跟臺(tái)階問題很像!
首先我們可以定義一個(gè)pre數(shù)組,表示1~i區(qū)間中,H比G多的個(gè)數(shù)
如果小于等于0的話,就意味著G占優(yōu)勢(shì),答案+1,大于0則H占優(yōu)勢(shì),答案不變
我們先來(lái)處理最容易的DP,dp[i]表示處理完i后的最小答案,很容易就寫出:
dp[i] = min ( dp[i], dp[i-j] + ( pre[i] - pre[i - j] ) ≤ 0 ? 1 : 0 )
1≤i≤n,1≤j≤k,
注意理解pre[i]-pre[i-j]實(shí)際上算的是[i-j+1,i]
但是這樣的dp是O(nk)肯定超時(shí)!!
我們得搞點(diǎn)事,做個(gè)數(shù)據(jù)優(yōu)化啥的!
首先我們每個(gè)i只會(huì)在外層循環(huán)1次,找到1~i-1之前加上i后最小的答案
所以就是求dp[i]=min{dp[i-j] + ( pre[i] - pre[i - j] ) ≤ 0 ? 1 : 0}
這就可以想到堆優(yōu)化,用優(yōu)先隊(duì)列維護(hù),每一次就取隊(duì)列的top
那么意思是我要維護(hù)這個(gè)隊(duì)列一定和i是合法的,
而且對(duì)答案的值貢獻(xiàn)是從小到大的
來(lái)思考一下dp[i-j] + ( pre[i] - pre[i - j] ) ≤ 0 ? 1 : 0
發(fā)現(xiàn) ( pre[i] - pre[i - j] ) ≤ 0 對(duì)于答案的影響只有1/0
真正影響的是dp[i-j],所以這個(gè)隊(duì)列我們就可以先維護(hù)dp[i-j]從小到大
當(dāng)dp[i-j]相同時(shí),再維護(hù)( pre[i] - pre[i - j] ) ≤ 0從小到大
那么我們就把dp值和下標(biāo)i丟到隊(duì)列里,讓隊(duì)列幫我們排序就好啦!
代碼實(shí)現(xiàn)
#include <cstdio> #include <queue> using namespace std; #define MAXN 300005 int n, k; char s[MAXN]; int dp[MAXN]; int pre[MAXN]; struct node {int val, id;bool operator < ( const node &t ) const {if ( val == t.val ) return pre[id] > pre[t.id];return val > t.val;} }; priority_queue < node > q; int main() {scanf ( "%d %d %s", &n, &k, s );for ( int i = 1;i <= n;i ++ ){if ( s[i - 1] == 'H' )pre[i] = pre[i - 1] + 1;elsepre[i] = pre[i - 1] - 1;dp[i] = 0x7f7f7f7f;}q.push ( ( node ) { 0, 0 } );for ( int i = 1;i <= n;i ++ ) {while ( ! q.empty() && q.top().id < i - k ) q.pop();dp[i] = ( pre[i] - pre[q.top().id] <= 0 ) ? q.top().val + 1 : q.top().val; q.push ( ( node ) { dp[i], i } );}printf ( "%d", dp[n] ); }
日更爆肝!真愛生命!遠(yuǎn)離熬夜,保健品你值得擁有
誘人問題都可以留言,我們有緣再見!bye不要太想我我怎么開始滿嘴跑火車了?
總結(jié)
以上是生活随笔為你收集整理的[USACO19JAN,Platinum] Redistricting的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 插座最全使用指南插座最全使用指南图解
- 下一篇: MySQL中存在索引但不能索引的经典场景