Milking Cows

来源:互联网 发布:三十岁 护肤品 知乎 编辑:程序博客网 时间:2024/04/28 21:10


题意
:有N个有序对(an, bn),其中最大的max,最小的min,每一个有序对(an, bn)可以在数轴上填满从an到bn这一段长度。求这N个有序对在min到max这段上填充后,最大的填满长度和最大的空白长度。


解题思路

  1. 一次读入每个有序对
  2. 用一个链表来代表这个数轴,链表的每一个Node代表一段被填充的部分
  3. 对每个读入的有序对进行插入操作。在插入的时候要分情况考虑,如果新加入的Node与已存在的Node没有交集,则新建。如果有交集,则只需要修改相应Node的值和指针就行。
  4. 遍历一遍链表,即可得到结果。


代码


/*ID: zc.rene1LANG: CPROG: milk2*/#include<stdio.h>#include<stdlib.h>struct unit{int min;int max;struct unit * next;};FILE *fin;FILE *fout;void do_count(struct unit * list_head){int during_max=0, empty_max=0, pre_value;list_head=list_head->next;during_max=list_head->max-list_head->min;pre_value=list_head->max;while(list_head->next->max<=1000000){list_head=list_head->next;if((list_head->max-list_head->min)>during_max){during_max=(list_head->max-list_head->min);}if((list_head->min-pre_value)>empty_max){empty_max=(list_head->min-pre_value);}pre_value=list_head->max;}fprintf(fout, "%d %d\n", during_max, empty_max);}void do_insert(struct unit * list_head, int time_from, int time_to){//keep searching until left foot is on the groundstruct unit *current=list_head;while(current->min > time_from || current->next->min <= time_from){current=current->next;}//keep searching until right foot is on the groundstruct unit *current_p=current;while(current_p->min > time_to || current_p->next->min<= time_to){current_p=current_p->next;}//if a new node is neededif(current==current_p&& time_from>current->max){struct unit* new=(struct unit *)malloc(sizeof(struct unit));new->min=time_from;new->max=time_to;new->next=current->next;current->next=new;}else{if(time_from > current->max){if(time_to > current_p->max){current_p->min= time_from;current_p->max= time_to;current->next=current_p;}else{current_p->min= time_from;current->next=current_p;}}else{if(time_to > current_p->max){current->max= time_to;current->next= current_p->next;}else{current->max= current_p->max;current->next= current_p->next;}}}}int main(void){struct unit * list_head=(struct unit *)malloc(sizeof(struct unit));fin=fopen("milk2.in", "r");fout=fopen("milk2.out", "w");int number_of_input;int time_from, time_to;fscanf(fin, "%d", &number_of_input);list_head->min=-2;list_head->max=-1;list_head->next=(struct unit *)malloc(sizeof(struct unit));list_head->next->min=1000001;list_head->next->max=1000002;list_head->next->next=NULL;for(; number_of_input>0; number_of_input--){fscanf(fin, "%d %d", &time_from, &time_to);do_insert(list_head, time_from, time_to);}do_count(list_head);return 0;}



原创粉丝点击