膜拜

来源:互联网 发布:淘宝高达 编辑:程序博客网 时间:2024/05/16 01:13
【题目描述】

某学校有两位神牛,神牛甲和神牛乙。新入学的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;}
0 0
原创粉丝点击