P2837 晚餐队列安排
題目背景
Usaco Feb08 Bronze
題目描述
為了避免餐廳過(guò)分擁擠,FJ要求奶牛們分2批就餐。每天晚飯前,奶牛們都會(huì)在餐廳前排隊(duì)入內(nèi),按FJ的設(shè)想,所有第2批就餐的奶牛排在隊(duì)尾,隊(duì)伍的前半部分則由設(shè)定為第1批就餐的奶牛占據(jù)。由于奶牛們不理解FJ的安排,晚飯前的排隊(duì)成了一個(gè)大麻煩。 第i頭奶牛有一張標(biāo)明她用餐批次D_i(1 <= D_i <= 2)的卡片。雖然所有N頭奶牛排成了很整齊的隊(duì)伍,但誰(shuí)都看得出來(lái),卡片上的號(hào)碼是完全雜亂無(wú)章的。 在若干次混亂的重新排隊(duì)后,FJ找到了一種簡(jiǎn)單些的方法:奶牛們不動(dòng),他沿著隊(duì)伍從頭到尾走一遍,把那些他認(rèn)為排錯(cuò)隊(duì)的奶牛卡片上的編號(hào)改掉,最終得到一個(gè)他想要的每個(gè)組中的奶牛都站在一起的隊(duì)列,例如112222或111122。有的時(shí)候,FJ會(huì)把整個(gè)隊(duì)列弄得只有1組奶牛(比方說(shuō),1111或222)。 你也曉得,FJ是個(gè)很懶的人。他想知道,如果他想達(dá)到目的,那么他最少得改多少頭奶牛卡片上的編號(hào)。所有奶牛在FJ改卡片編號(hào)的時(shí)候,都不會(huì)挪位置。
輸入輸出格式
輸入格式:
?
第1行: 1個(gè)整數(shù):N * 第2..N+1行: 第i+1行是1個(gè)整數(shù),為第i頭奶牛的用餐批次D_i
?
輸出格式:
?
一行: 輸出1個(gè)整數(shù),為FJ最少要改幾頭奶??ㄆ系木幪?hào),才能讓編號(hào)變成他設(shè)想中的樣子。
?
輸入輸出樣例
輸入樣例#1:7 2 1 1 1 2 2 1 輸出樣例#1:
2 輸入樣例#2:
5 2 2 1 2 2 輸出樣例#2:
1
說(shuō)明
1 <= N <= 30000
?
用dp[i][j]表示枚舉到第i頭牛,將第i頭牛的狀態(tài)改為j+1所需要的最小方案數(shù)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 void read(int &n) 8 { 9 char c='+';int x=0;bool flag=0; 10 while(c<'0'||c>'9') 11 {c=getchar();if(c=='-')flag=1;} 12 while(c>='0'&&c<='9') 13 {x=x*10+(c-48);c=getchar();} 14 flag==1?n=-x:n=x; 15 } 16 int n; 17 int a[30001]; 18 int dp[30001][3]; 19 int main() 20 { 21 read(n); 22 for(int i=1;i<=n;i++) 23 read(a[i]); 24 if(a[1]==1) 25 { 26 dp[1][0]=0; 27 dp[1][1]=1;// 改成2 28 } 29 else 30 { 31 dp[1][1]=0; 32 dp[1][0]=1; 33 } 34 for(int i=2;i<=n;i++) 35 { 36 if(a[i]==1)// 當(dāng)前是一 37 { 38 dp[i][0]=dp[i-1][0]; 39 dp[i][1]=min(dp[i-1][1],dp[i-1][0])+1; 40 // 需要改成2 41 } 42 else // 當(dāng)前是2 43 { 44 dp[i][0]=dp[i-1][0]+1; 45 dp[i][1]=min(dp[i-1][1],dp[i-1][0]); 46 } 47 } 48 printf("%d",min(dp[n][0],dp[n][1])); 49 return 0; 50 }?
總結(jié)
以上是生活随笔為你收集整理的P2837 晚餐队列安排的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 百度地图定位记录
- 下一篇: 智能安防 回家开门进入“看脸”时代