洛谷 P2837 晚餐隊列的安排
阿新 • • 發佈:2018-07-17
混亂 是個 using 理解 由於 urn 輸入格式 簡單 得到
為了避免餐廳過分擁擠,FJ要求奶牛們分2批就餐。每天晚飯前,奶牛們都會在餐廳前排隊入內,按FJ的設想,所有第2批就餐的奶牛排在隊尾,隊伍的前半部分則由設定為第1批就餐的奶牛占據。由於奶牛們不理解FJ的安排,晚飯前的排隊成了一個大麻煩。 第i頭奶牛有一張標明她用餐批次D_i(1 <= D_i <= 2)的卡片。雖然所有N頭奶牛排成了很整齊的隊伍,但誰都看得出來,卡片上的號碼是完全雜亂無章的。 在若幹次混亂的重新排隊後,FJ找到了一種簡單些的方法:奶牛們不動,他沿著隊伍從頭到尾走一遍,把那些他認為排錯隊的奶牛卡片上的編號改掉,最終得到一個他想要的每個組中的奶牛都站在一起的隊列,例如112222或111122。有的時候,FJ會把整個隊列弄得只有1組奶牛(比方說,1111或222)。 你也曉得,FJ是個很懶的人。他想知道,如果他想達到目的,那麽他最少得改多少頭奶牛卡片上的編號。所有奶牛在FJ改卡片編號的時候,都不會挪位置。
輸入輸出格式
輸入格式:
第1行: 1個整數:N * 第2..N+1行: 第i+1行是1個整數,為第i頭奶牛的用餐批次D_i
1<=n<=3000
輸出格式:
一行: 輸出1個整數,為FJ最少要改幾頭奶牛卡片上的編號,才能讓編號變成他設想中的樣子。
輸入輸出樣例
輸入樣例#1: 輸出樣例#1:
7 2 2 1 1 1 2 2 1
直接考慮枚舉1與2的分界線。讓分界線從左往右移。
那麽如果從右邊到左邊的是2,就加一。
從右邊到左邊的是1,就減一。
#include<iostream> #include<cstdio> usingnamespace std; int a[40010]; int f[40010]; int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) if(a[i]==1)f[0]++; int minn=f[0]; for(int i=1;i<=n;i++) if(a[i]==1){ f[i]=f[i-1]-1; if(f[i]<minn)minn=f[i]; }else{ f[i]=f[i-1]+1; if(f[i]<minn)minn=f[i]; } cout<<minn; return 0; }
洛谷 P2837 晚餐隊列的安排