您的位置:首页 > 其它

USACO 1.2.1 Milking Cows(milk2)

2011-03-21 16:01 417 查看
1、按照开始时间升序排序(快排),然后从左到右扫一遍,复杂度O(nlogn+n)

2、快排是自己写的,因为是数组排序,比较容易出问题。

/*
ID: gengjia1
LANG: C
TASK: milk2
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//////////////////////// 快速排序 //////////////////////////
int partition(int t[][2], int low, int high)
{
int pivotkey = t[low][0];
while (low<high)
{
while (low<high && t[high][0] >= pivotkey) --high;
t[low][0] = t[high][0];
t[low][1] = t[high][1];
while (low<high && t[low][0] <= pivotkey) ++low;
t[high][0] = t[low][0];
t[high][1] = t[low][1];
}
t[low][0] = pivotkey;
return low;
}
void qsort(int t[][2], int low, int high)
{
int pivotloc;
if (low < high)
{
pivotloc = partition(t, low, high);
qsort(t, low, pivotloc-1);
qsort(t, pivotloc+1, high);
}
}
int main(void) {
FILE *fin = fopen ("milk2.in", "r");
FILE *fout = fopen ("milk2.out", "w");
int N, t;
int max_do = 0, max_undo = 0;
int time[5000][2];
int begin, end;
int tmp_begin, tmp_end;
int i, j;
fscanf (fin, "%d", &N);
assert(N >= 1);
assert(N <= 5000);
for(i = 0; i < N; i++)
{
for(j = 0; j < 2; j++)
{
fscanf (fin, "%d", &t);
assert(t > 0);
time[i][j] = t;
}
}
//按开始时间升序排序
qsort(time, 0, N-1);
//计算最大值
tmp_begin = time[0][0];
tmp_end = time[0][1];
for(i = 1; i < N; i++)
{
begin = time[i][0];
end = time[i][1];
if(begin < tmp_end)
{
if(tmp_end < end)
{
tmp_end = end;
}
if(max_do < tmp_end - tmp_begin)
{
max_do = tmp_end - tmp_begin;
}
}
else
{
if(max_undo < begin - tmp_end)
{
max_undo = begin - tmp_end;
}
tmp_begin = begin;
tmp_end = end;
}
}
fprintf (fout, "%d %d/n", max_do, max_undo);
fclose(fin);
fclose(fout);
exit(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: