这道题被归为完全搜索一类,看到这道题目最初的想法就是先按照开始时间排序,然后通过比较逐一更新要求的两个数值复杂度是O(nlogn+n),程序较简单。这种方法时间复杂度较高,想到还可以通过哈希,只用一次循环就可以解决,时间复杂度为O(n)。
O(nlogn+n)
/*
ID: acmerfi1
PROG: milk2
LANG: C++
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct time
{
int begin, end;
}time;
time a[5001];
int cmp(const void *a, const void *b)
{
return (*(time *)a).begin -(*(time *)b).begin;
}
int main()
{
freopen("milk2.in", "r", stdin);
freopen("milk2.out", "w", stdout);
int n, t, max1 = 0, max2 = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d%d", &a[i].begin, &a[i].end);
}
qsort(a, n, sizeof(a[0]), cmp);
time cur = a[0];
for(int i = 1; i < n; i++)
{
if(a[i].begin > cur.end)
{
t = a[i].begin - cur.end;
if(t > max1) max1 = t;
t = cur.end - cur.begin;
if(t > max2) max2 = t;
cur = a[i];
}
else
{
if(a[i].end > cur.end) cur.end = a[i].end;
}
}
t = cur.end - cur.begin;
if(t > max2) max2 = t;
printf("%d %d\n", max2, max1);
return 0;
}
O(n)/*
ID: acmerfi1
LANG: C++
TASK: milk2
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxNum 1000005
int maxEnd = 0, minBigen = maxNum, max[2] = {0, 0};
int hash[maxNum];
int main()
{
freopen("milk2.in", "r", stdin);
freopen("milk2.out", "w", stdout);
int N, bigen, end, j = 0;
memset(hash, 0, sizeof(hash));
scanf("%d", &N);
while(N--)
{
scanf("%d%d", &bigen, &end);
end--;
if(bigen < minBigen) minBigen = bigen;
if(end > maxEnd) maxEnd = end;
for(int i = bigen; i <= end; i++) hash[i] = 1;
}
for(int i = minBigen; i < maxEnd; i += j)
{
for(j = 1; hash[i+j] == hash[i]; j++);
if(j > max[hash[i]]) max[hash[i]] = j;
}
printf("%d %d\n", max[1], max[0]);
return 0;
}