看球的巴士

题目描述

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

 

原文链接: https://www.cnblogs.com/LightyaChoo/p/13062123.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    看球的巴士

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/353571

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午8:08
下一篇 2023年3月2日 上午8:09

相关推荐