#include <stdio.h>
#define DEBUG 0
#define TESTCASES 9
#define MAX 5000
int numOfFarmers;
int time[MAX][2];
int temp[MAX][2];
void timeCopy(int to[], int from[]){
to[0] = from[0];
to[1] = from[1];
}
void merge(int first, int mid, int last){
int left = first;
int right = mid + 1;
int index = first;
while (left <= mid && right <= last){
//先按开始时间排序,若开始时间相等,则按结束时间排序
if (time[left][0] == time[right][0])
if (time[left][1] < time[right][1])
timeCopy(temp[index], time[left++]);
else
timeCopy(temp[index], time[right++]);
else if (time[left][0] < time[right][0])
timeCopy(temp[index], time[left++]);
else
timeCopy(temp[index], time[right++]);
index++;
}
while (left <= mid)
timeCopy(temp[index++], time[left++]);
while (right <= last)
timeCopy(temp[index++], time[right++]);
for (index = first; index <= last; index++)
timeCopy(time[index], temp[index]);
}
void mergeSortTime(int first, int last){
if (first >= last)
return;
int mid = (first + last) / 2;
mergeSortTime(first, mid);
mergeSortTime(mid + 1, last);
merge(first, mid, last);
}
int main(){
#if DEBUG
int testCase;
for (testCase = 7; testCase <= TESTCASES; testCase++){
char inputFileName[20] = "inputX.txt";
inputFileName[5] = '1' + (testCase - 1);
freopen(inputFileName, "r", stdin);
printf("\n#%d\n", testCase);
#endif
scanf("%d", &numOfFarmers);
int farmer;
for (farmer = 0; farmer < numOfFarmers; farmer++)
scanf("%d %d", &time[farmer][0], &time[farmer][1]);
mergeSortTime(0, numOfFarmers - 1);
int start = time[0][0];
int end = time[0][1];
int maxMilkingTime = end - start;
int maxNoMilkingTime = 0;
for (farmer = 1; farmer < numOfFarmers; farmer++){
//注意判断的逻辑,只有两种情况下会改变[start, end]区间
if (time[farmer][0] > end){
//[start, end]区间变为[start, time[farmer][1]]
start = time[farmer][0];
if (start - end > maxNoMilkingTime)
maxNoMilkingTime = start - end;
end = time[farmer][1];
continue;
}
if (time[farmer][0] <= end && time[farmer][1] > end){
//[start, end]区间变为[time[farmer][0], time[farmer][1]]
end = time[farmer][1];
if (end - start > maxMilkingTime)
maxMilkingTime = end - start;
}
}
printf("%d %d\n", maxMilkingTime, maxNoMilkingTime);
#if DEBUG
}
#endif
return 0;
}
USACO 1.2 Milking Cows (归并排序+离散化)
最新推荐文章于 2020-07-22 08:25:12 发布