看球的巴士
Posted z8875
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
题解
解题思路
一道简单的DP。
设状态(f_i)为前(i)个人最少乘坐几辆车
一辆车中符合题目要求的有两种坐法
-
车里两队的人数差 < D
-
车里只有一队的人
那就让满足这样条件的人坐一辆车
即(f_i = min(f_i, f_{j-1} + 1);)
代码
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2505;
int n, d, s[N], f[N];
int main() {
memset(f, 0x3f, sizeof(f));
f[0] = 0;
scanf("%d%d", &n, &d);
for(int i = 1; i <= n; i++) {
char c;
scanf(" %c", &c);
if (c == ‘H‘) s[i] = s[i-1] + 1;
else s[i] = s[i-1] - 1;
//s[i]是前i个人中H队与J队的人数差,用了前缀和的思想
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++)
if (abs(s[i] - s[j-1]) == i-j+1 || abs(s[i] - s[j-1]) <= d)
//这里就是提到的两个条件
f[i] = min(f[i], f[j-1] + 1);
printf("%d
", f[n]);
return 0;
}
以上是关于看球的巴士的主要内容,如果未能解决你的问题,请参考以下文章