看球的巴士

Posted lightyachoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了看球的巴士相关的知识,希望对你有一定的参考价值。

题目描述

两个球队的支持者要一起坐车去看球,他们已经排成了一列。我们要让他们分乘若干辆巴士,同一辆巴士上的人必须在队伍中是连续的。为了在车上不起冲突,希望两队的支持者人数尽量相等,差至多是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;
}

 

以上是关于看球的巴士的主要内容,如果未能解决你的问题,请参考以下文章

看球的巴士

看球的巴士

看球的巴士

能从家中看球的球场

能从家中看球的球场

Unity2017中VR全景图和全景视频设置