膜拜

【题目描述】

某学校有两位神牛,神牛甲和神牛乙。新入学的N位同学们早已耳闻他们的神话。所以,已经衷心地膜拜其中一位了。
现在,老师要给他们分机房。
但是,要么保证整个机房都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过M。
另外,现在N位同学排成一排,老师只会把连续一段的同学分进一个机房。老师想知道,至少需要多少个机房。

【输入描述】

输入文件第一行包括N和M。
之后N行,每行一个整数,1表示神牛甲的崇拜者,2表示神牛乙的崇拜者。

【输出描述】

输出一个整数,表示最小需要机房的数量。

【样例输入】

5 1 

2  


2

【样例输出】

2

【数据范围及提示】

对于30%的数据,有1≤N,M≤50
对于100%的数据,有1≤N,M≤2500

源代码:

#include<cstdio>
#include<cstring>
#include<algorithm> //包含整型的abs()。 
using namespace std;
int m,n,i[2501],f[2501];
int main()
{
    scanf("%d%d",&n,&m);
    memset(f,0x3f,sizeof(f)); //初始化最大值,为后面找最小值做准备。 
    for (int a=1;a<=n;a++)
      scanf("%d",&i[a]);
    f[0]=0; //边界条件。 
    for (int a=1;a<=n;a++)
    {
        int t1(0),t2(0);
        if (i[a]==1)
          t1=1;
        else
          t2=1;
        for (int b=a-1;b>=0;b--) //从当前节点倒序更新,并求出其最小值。 
        {
              if (abs(t1-t2)<=m||(!t1||!t2)) //若一方为0,则一定只占1间。 
              f[a]=f[a]<f[b]+1?f[a]:f[b]+1;
            if (i[b]==1) //更新各类人数。 
              t1++;
            else
              t2++;
        }
    }
    printf("%d",f[n]);
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5313133.html