码迷,mamicode.com
首页 > 其他好文 > 详细

看球的巴士

时间:2020-06-22 21:05:17      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:输入格式   顺序   ++   eof   name   前缀   print   code   ==   

题目描述

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

看球的巴士

标签:输入格式   顺序   ++   eof   name   前缀   print   code   ==   

原文地址:https://www.cnblogs.com/Z8875/p/13178993.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!