(纪中)1876. 罗密欧与朱丽叶的约会【数学】

(File IO): input:meet.in output:meet.out
时间限制: 3000 ms 空间限制: 128000 KB 具体限制
Goto ProblemSet


题目描述
农场主约翰养了两群有世仇的牛,它们被称为蒙塔戈斯家族和卡普鲁特家族。蒙塔戈斯家族的成员,罗密欧,爱上了美丽的朱丽叶,但后者正好是卡普鲁特家族的成员。罗密欧希望与朱丽叶约会,但不希望卡普鲁特家族的其他成员发现(否则会有可怕的事情发生!)
​ 罗密欧和朱丽叶希望在牧场栅栏边一块尽可能大的区域中相见,这样他们可以边散步边聊天。然而,这块区域中不应该有太多的卡普鲁特家族成员,否则,他们俩被发现的机会就会大得多。罗密欧发现在整个牧场栅栏边有 P P 块草坪呈直线排列 1 < = P < = 1000 (1<=P<=1000) ,在这些草坪上总共有N位卡普鲁特家族的成员在吃草 1 < = N < = 1000 (1<=N<=1000) 。每个卡普鲁特家族的成员在一些相邻的草坪上吃草。现在,罗密欧求助于聪明的你,希望你能找出一个最大的范围(指一些相邻的草坪),在这个范围的草坪中,至多有 C 1 < = C < = 1000 C(1<=C<=1000〉 位卡普鲁特家族的成员在吃草。


输入
第一行,包含三个整数: N P C N,P,C
第二至 N + 1 N+1 行:每行包括一个整数 X 1 < = X < = P 1 X(1<=X<=P-1) ,代表一个卡普鲁特家族成员在栅栏边的第 X X X + 1 X+1 块草坪之间吃草,多个卡普鲁特家族成员可以在同一块草坪内一起吃草。

输出
只有一行:一个整数,代表一个最大的草坪范围(指这些草坪的块数),在这个范围内最多只有 C C 个卡普鲁特家族的成员在吃草。


样例输入

2 6 1
2
3
(解释:栅栏边的草坪分为六块: 1 , 2 , 3 , 4 , 5 1 ,2 ,3, 4 ,5 6 6 。有两个卡普鲁特家族成员,一个在第二和第三块草坪上吃草,一个在第三和第四块草坪上吃草)

样例输出

3
(解释:在第四块至至第六块草坪间只有一个卡普鲁特家族的成员在吃草)


数据范围限制
1 < = P < = 1000 1<=P<=1000
1 < = N < = 1000 1<=N<=1000
1 < = C < = 1000 1<=C<=1000


解题思路
这道题用前缀和的方法。。
卡普鲁特家族成员在栅栏边的第 X X X + 1 X+1 块草坪之间吃草,我们只标记 x + 1 x+1 ,因为只有一个人,只能在一个草坪。但若只标记 x x ,会使答案多 1 1


代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,p,c,x;
int a[1010],maxn;
int main(){
	freopen("meet.in","r",stdin);
    freopen("meet.out","w",stdout);
    scanf("%d%d%d",&n,&p,&c);
    for(int i=1;i<=n;i++){
    	scanf("%d",&x);
    	a[x+1]++;
	}
	for(int i=1;i<=p;i++)
		a[i]+=a[i-1];
	for(int i=1;i<=p;i++)
	{
		for(int j=1;j<i;j++)
		{
			if((a[i]-a[j])<=c)
			{
				if((i-j)>maxn)
				maxn=i-j;
			}
		}
	}
	printf("%d",maxn);
}
发布了73 篇原创文章 · 获赞 5 · 访问量 1809

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/104314700