3369 膜拜
題目描述?Description
神牛有很多…當然…每個同學都有自己衷心膜拜的神牛.
某學校有兩位神牛,神牛甲和神牛乙。新入學的N位同學們早已耳聞他們的神話。所以,已經衷心地膜拜其中一位了。
現在,老師要給他們分機房。
但是,要么保證整個機房都是同一位神牛的膜拜者,或者兩個神牛的膜拜者人數差不超過M。
另外,現在N位同學排成一排,老師只會把連續一段的同學分進一個機房。老師想知道,至少需要多少個機房。
輸入文件第一行包括N和M。
之后N行,每行一個整數,1表示神牛甲的崇拜者,2表示神牛乙的崇拜者。
輸出一個整數,表示最小需要機房的數量。
樣例輸入?Sample Input5 1?
2?
2 ?
1?
2?
2
2
數據范圍及提示?Data Size & Hint對于30%的數據,有1≤N,M≤50;
對于100%的數據,有1≤N,M≤2500
分析:假設一共有n個人,那么要使所分得房間最少,那么從最后人一個開始,試圖找出一個最長的可合并的序列,則找到后需要的房間數目為 這段序列需要的一間房子 和 剩余人數所需要的房子,假設其值為 ?1 + fs ?,則最后n個人所需房子的最小值 f[n] = min(1+fs,f[n]) ,根據此思路遞推求解即可。
序列可合并的情況包括 人數差小于 m,及某個序列由同一位神牛的崇拜者組成。
代碼如下:
#include <iostream> #include <cmath> using namespace std; int N,M; int f[3001]; int p[3001]; int main() {int s1 = 0,s2 = 0;for (int i = 1; i <= 3000; i++){f[i] = 3001;}cin >> N >> M;for (int i = 1; i <= N; i++){cin >> p[i];}for (int i = 1; i <= N; i++){s1 = s2 = 0;int minfj = 3001;for (int j = i; j >= 1; j--){if (p[j] == 1)s1++;elses2++;if (s1 == 0 || s2 == 0 || abs(s1 - s2) <= M){minfj = min(minfj,f[j-1]+1);}}f[i] = min(f[i],minfj);}cout<<f[N];return 0; }總結
- 上一篇: html中span隐藏属性,span标签
- 下一篇: 实时视频传输协议RTP