日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

[USACO19JAN,Platinum] Redistricting

發(fā)布時(shí)間:2023/12/3 数据库 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [USACO19JAN,Platinum] Redistricting 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。