zoukankan      html  css  js  c++  java
  • 膜拜

    【题目描述】

    某学校有两位神牛,神牛甲和神牛乙。新入学的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;
    }
  • 相关阅读:
    第二节:简单工厂模式(静态工厂模式)
    第一节:不使用设计模式的传统方式
    第三章:设计模式概述
    第二节:类与类之间的关系
    高斯混合模型(GMM)
    随机森林
    LDA主题模型
    Adaboost算法
    线性代数
    k-means聚类
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5313133.html
Copyright © 2011-2022 走看看