[USACO] Milking Cows

    技术2022-05-20  71

    题目叙述的很清晰,关键的一步就是先把输入数据按照开始时间进行排序。

    问题就处在这里了,我用的快排,可是1000数据量的测试总也过不去,调试才发现,快排写错了,我只是把开始时间进行了排序,可是相对应的结束时间并没有跟着调整,结果出现了2万多秒的时间间隔!!

    唉!本来想用结构体定义一下的,但是一想两个元素也不难就懒的写,结果杯具发生了,代码不清晰不说,还调试了好长时间,得不偿失啊

    剩下的程序逻辑不是很难,把所有情况考虑清楚马上就可以AC了~~

     


     

    /* ID: LANG: C TASK: milk2 */ #include <stdio.h> #include <stdlib.h> #define N 5000 int partition(int tm[][2], int i, int j) { int pivot, addon; pivot = tm[i][0]; addon = tm[i][1]; while(i < j) { while(i < j && tm[j][0] > pivot) j--; if(i < j) { tm[i][0] = tm[j][0]; tm[i][1] = tm[j][1]; i++; } while(i < j && tm[i][0] < pivot) i++; if(i < j) { tm[j][0] = tm[i][0]; tm[j][1] = tm[i][1]; j--; } } tm[i][0] = pivot; tm[i][1] = addon; return i; } void quick_sort(int tm[][2], int low, int high) { int index; if(low < high) { index = partition(tm, low, high); quick_sort(tm, low, index - 1); quick_sort(tm, index + 1, high); } } int main() { FILE *fin = fopen("milk2.in", "r"); FILE *fout = fopen("milk2.out", "w"); int tm[N][2]; int n, i, start, end; int busy_t, idle_t; fscanf(fin, "%d", &n); for(i = 0; i < n; i++) fscanf(fin, "%d %d", &tm[i][0], &tm[i][1]); quick_sort(tm, 0, n-1); //for(i = 0; i < n; i++) //fprintf(fout, "%d %d/n", tm[i][0], tm[i][1]); i = 1; start = tm[0][0]; end = tm[0][1]; busy_t = idle_t = 0; while(i < n) { if(tm[i][0] <= end) { if(tm[i][1] > end) end = tm[i][1]; i++; continue; } else { if(end - start > busy_t) busy_t = end - start; if(tm[i][0] - end > idle_t) idle_t = tm[i][0] - end; start = tm[i][0]; end = tm[i][1]; i++; } } if(end - start > busy_t) // in case the last one or ones! busy_t = end - start; fprintf(fout, "%d %d/n", busy_t, idle_t); exit(0); }  

     


     

    分析的解法一:和我的思路是一样的,它的快排用的是标准库,所以自己要写一个比较函数。。。

    分析的解法二:此方法把开始和结束时间全都进行排序,只不过加了一个标记便于区别。比如对于实例排序完成时的结果如下(居然没有插入表格功能?!我勒个去,无语。。。)

    300    700    1000     1200    1500    2100

      1        1         -1          -1          1          -1

    于是可以看出有两种情况(k作为数组下标)

    1.k=3或5时,恰好刚完成任务,工人数为0,可以求出工作时间

    2.k=4时,工人数不为0,前一个任务刚结束,新的任务刚开始,所以可以求出空闲时间

     

    此方法我没有想到,总是认为程序AC就万事大吉,也没有认真思考过别的方法。但肯定有大牛想得到的,努力学习啊!^_^


    最新回复(0)