zoukankan      html  css  js  c++  java
  • 看球的巴士

    题目描述

    两个球队的支持者要一起坐车去看球,他们已经排成了一列。我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的。为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是D。有一个例外,就是一辆车上的人全部都是一个球队的支持者。问要将这N个人全部送至球场,至少要几辆巴士。

    输入格式

    第一行是整数N和D,1<=N<=2500,1<=D<=N。

    接下来的N行,按排队的顺序,描述每个人支持的球队,用H或J表示。

    输出格式

    至少要几辆巴士。

    样例

    样例输入

    14 3
    H
    J
    H
    H
    H
    J
    H
    J
    H
    H
    H
    H
    H
    H
    

    样例输出

    2
    

    我们让f[i]表示到第i个人所需的最小的巴士数,在第i个人时,我们向前遍历到j,同时记录两队的人数,若满足条件,则f[i]=f[j-1]+1
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<bits/stdc++.h>
    using namespace std;
    const int n=3000;
    int N,D;
    char a[n];
    int f[n];
    int a1,a2;
    
    
    int main(){
        scanf("%d%d",&N,&D);
        //memset(f,0x3fffff,sizeof(f));
        for(int i=1;i<=N;i++){
            scanf(" %c",&a[i]);//在这里一定要注意前面有空格,我当时就错了,搞了半天还是对博客看出来的!!!
            f[i]=0x7fffff;
        }
        f[0]=0;
        for(int i=1;i<=N;i++){
            for(int j=i;j>=1;j--){
                if(a[j]=='H')a1++;
                if(a[j]=='J')a2++;
                if(a1==0||a2==0||abs(a1-a2)<=D){
                    f[i]=min(f[i],f[j-1]+1);
                }
                
            }
            a1=0;a2=0;
        }
        printf("%d
    ",f[N]);
        return 0;
    }
  • 相关阅读:
    mysql
    Spring MVC
    springSecurity
    导出Excel报表
    Redis集群搭建
    Oracle 分析数据库表行长度的统计信息 使用聚簇的步骤
    Dbms.job 学习
    oracel 学习系列
    Oracle 工具类 Sql 分析索引的 碎片率
    oracl
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13062123.html
Copyright © 2011-2022 走看看