这道题一开始以为很简单,就是求最长连续区间和最长不连续区间。不就是贪心吗?但是提交了4次,错了4次。无解之下,看了题解,发现别人写的代码真的是太优美了!
思路很简单,就是用一个cur变量来记录当前的时间段,如果没有发生断层,那么把当前的结束时间赋给cur的end;如果出现断层,那么就进行清算:计算当前的断层长度是否比原来的最大长度长?如果是,就替换!然后再计算当前的连续区间,如果比原来的长,那么就替换。最后,把当前的时间段赋给cur!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXMILKING 5001
typedef struct Milking Milking;
struct Milking
{
int begin;
int end;
};
Milking milking[MAXMILKING];
int nmilking;
int milkcmp(const void *va, const void *vb)
{
Milking *a, *b;
a = (Milking*)va;
b = (Milking*)vb;
if(a->begin > b->begin)
return 1;
if(a->begin < b->begin)
return -1;
return 0;
}
int main(void)
{
FILE *fin, *fout;
int i, j, t, tmilk, tnomilk;
Milking cur;
fin = fopen("milk2.in", "r");
fout = fopen("milk2.out", "w");
assert(fin != NULL && fout != NULL);
fscanf(fin, "%d", &nmilking);
for(i=0; i<nmilking; i++)
fscanf(fin, "%d %d", &milking[i].begin, &milking[i].end);
qsort(milking, nmilking, sizeof(Milking), milkcmp);
tmilk = 0;
tnomilk = 0;
cur = milking[0];
for(i=1; i<nmilking; i++)
{
if(milking[i].begin > cur.end)
{
t = milking[i].begin - cur.end;
if(t > tnomilk)
{
tnomilk = t;
}
t = cur.end - cur.begin;
if(t > tmilk)
{
tmilk = t;
}
cur = milking[i];
}
else
{
if(milking[i].end > cur.end)
{
cur.end = milking[i].end;
}
}
}
t = cur.end - cur.begin;
if(t > tmilk)
tmilk = t;
fprintf(fout, "%d %d\n", tmilk, tnomilk);
exit(0);
}