One Day One Step 之Milking Cows

这道题一开始以为很简单,就是求最长连续区间和最长不连续区间。不就是贪心吗?但是提交了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);
}



猜你喜欢

转载自blog.csdn.net/u011564456/article/details/20380089
one