安排车厢
X中学的同学们要去春游了,他们春游的地点非常遥远,所以学校安排的交通工具是火车!现在所有的同学都已经在火车站进站口等待了,一共n名同学,他们排成了一行按照这个顺序登车。一节火车厢最多可以容纳m名同学,但是由于某种奇特的原因,一节车厢里只允许要么所有的同学都是同一种性别,要么男生和女生的人数差不能超过k,现在请问学校该怎样安排同学们才能使得用到的车厢尽量的少呢?
输入文件
第一行三个数,分别表示n (n <= 1000),m和k
接下来n行描述排队的顺序,每行一个字母,表示是B(boy)或者是G(girl)
输出文件
一个整数表示至少需要的车厢数。
样例输入
5 4 1
B
G
G
G
B
样例输出
2
状态转移方程:
dp[j]+1 (j+1到i的学生可以组成一个车厢)
dp[i]= (0<=j<i)
inf (j+1到i的学生不能组成一个车厢)
代码:
#include <stdio.h>
#define MAXN 1010
#define inf 1000000000
int n,m,k;
int sumb[MAXN];
int sumg[MAXN];
char stu[MAXN];
int dp[MAXN];
int abs(int x)
{
return x>=0? x:-x;
}
int pipei(int j,int i)
{
int sumboy = sumb[i] - sumb[j];
int sumgirl = sumg[i] - sumg[j];
return (i-j <= m) && (sumboy==0 || sumgirl==0 || abs(sumboy-sumgirl)<=k);
}
int main()
{
scanf("%d%d%d\n",&n,&m,&k);
sumb[0]=0;
sumg[0]=0;
dp[0]=0;
for(int i = 1; i <= n; i++)
{
scanf("%c\n",stu+i);
if(stu[i] == 'B') {sumb[i]=sumb[i-1]+1; sumg[i]=sumg[i-1]; }
if(stu[i] == 'G') {sumg[i]=sumg[i-1]+1; sumb[i]=sumb[i-1]; }
dp[i]=inf;
for(int j = 0; j < i; j++)
{
if(pipei(j,i) && dp[j]+1 < dp[i])
{
dp[i] = dp[j]+1;
}
}
}
//for(int i=1; i<=n; i++)
//{
// printf("%d %c %d\n",i,stu[i],dp[i]);
//}
printf("%d\n",dp[n]);
return 0;
}
浙公网安备 33010602011771号