题目翻译:
三个农民每天早上5点起床, 前往谷仓给三头奶牛挤奶。第一个农民在时间300开始挤奶(早上5点后以秒为单位测量), 在时间1000结束。第二个农民开始于时间700, 结束于时间1200。第三个农民开始于时间1500, 结束于时间2100。至少一个农民挤奶的最长连续时间是900秒(从300秒到1200秒)。从开始挤奶到结束挤奶的最长时间是300秒( 1500减去1200 )。
你的工作是编写一个程序, 检查N ( 1 < = N < = 5000 )个挤奶农民的开始和结束时间列表, 并计算(秒) :
1.至少有一头母牛挤奶的最长时间间隔。
2.没有奶牛被挤奶的最长时间间隔(挤奶开始后)。
项目名称: milk2
输入格式:
第一行:单整数, N2....N+1行:小于1, 000, 000的两个非负整数, 分别是0500之后的开始和结束时间(秒)
输出格式:
两个整数的单行,表示最长的连续挤奶时间和最长的空闲时间。
暴力解题:
创建一个足够大(1000000)的数组,初始化为0,将挤奶的时间赋值为1。将题目转变为在一个只有1和0的数组中找最长的连续1和最长的连续0。
代码(C):
/*
ID: xyj11361
LANG: C
TASK: milk2
*/
#include <stdio.h>
void main()
{
FILE *fin = fopen ("milk2.in", "r");
FILE *fout = fopen ("milk2.out", "w");
int start,end,min=1000000,max=0,n,i,j,a=0,b=0,max_continue=0,max_idle=0,s[1000000]={0};
fscanf(fin,"%d",&n);
for(i = 0; i < n; i++)
{
fscanf(fin, "%d %d", &start, &end);
for(j = start; j < end; j++)
{
s[j] = 1;
}
if(start <= min) min = start;
if(end >= max) max = end;
}
for(i = min; i <= max; i++)
{
if(s[i] == 1)
{
a++;
if(b >= max_idle)
max_idle = b;
b = 0;
}
if(s[i] == 0)
{
b++;
if(a >= max_continue)
max_continue = a;
a=0;
}
}
fprintf(fout, "%d %d\n", max_continue, max_idle);
}