希望更好的阅读体验?点这里
题目:
约翰的农场里有很多奶牛,每次喂奶牛的时候,奶牛们挤在一起围成一圈,导致挤在后面的奶牛吃不到草料。于是约翰去市场买了 N N N 个料槽,在农场里将这 N N N 个料槽排成一行。每个料槽有两个位置,可供两头奶牛使用,这样每头奶牛就有了一个属于自己的固定的料槽位置,奶牛们终于可以愉快的享用大餐了。奶牛的食量有大有小,约翰将食量分为 5 5 5 个等级,等级为 1 1 1 表示食量最小。约翰为了掌握奶牛的健康状况,时常会对奶牛进行考察。例如约翰想对食量等级为 K K K 的奶牛进行考察,那么约翰就会从这 N N N 个料槽中选择连续的 L L L 个料槽进行查看,要求这 L L L 个料槽中至少每一个料槽有 1 1 1 头奶牛的食量等级刚好是 K K K 。现在请你帮约翰找出L的最大值即对应的等级 K K K 。
分析:
因为 K K K 最大为 5 5 5 ,所以枚举 K K K ,找到所有料槽中符合要求的连续料槽的个数,每次更新答案即可。
代码:
#include <cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
struct trough{
int a,b;
}t[100003];
int main(){
int n,L=-(1<<30),K;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].a,&a[i].b);
for(int k=1;k<=5;k++){//枚举k
int s=-(1<<30),i=1,j;//s为连续料槽的个数
while(i<=n){
if(t[i].a==k||t[i].b==k){
for(j=i+1;j<=n&&(t[j].a==k||t[j].b==k);j++);
//找到连续符合要求的料槽位置的右边界
s=max(s,(j-1)-i+1);//注意j要减1,因为此时j已经不符合要求了
i=j;
}
else ++i;
}
if(L<s) L=s,K=t;//更新答案
}
printf("%d %d\n",L,K);
return 0;
}
noip模拟赛老师给我们做的,洛谷上有原题……