POJ百練 - 2808:校門外的樹
- 鏈接:http://poj.grids.cn/practice/2808
方法1(空間換時間):
#include <stdio.h>
int main()
{
int L, M;
int nTrees[10005] = {0};
int start, end;
int nCount = 0;
scanf("%d%d", &L, &M);
while (M--)
{
scanf("%d%d", &start, &end);
for (int i = start; i <= end; ++i)
{
nTrees[i] = 1;
}
}
for (int i = 0; i <= L; ++i)
{
if (nTrees[i] == 0)
{
nCount++;
}
}
printf("%d\n", nCount);
return 0;
}
思想是將所有區間存儲在數組里面,對所有區間以下限為標準排序,然后從頭至尾掃描區間數組,
合并區間的方法是:當前區間初始化為第一個區間,然后判斷下一個區間的下限是否已經超過當前區間的上限,如果是這樣的話,就無法繼續合并了,那么就繼續已經合并區間的長度,重新開始一次新的合并,否則的話,將下一個區間合并到當前區間起來。。。
#include <stdio.h>
#include <stdlib.h>
#define M_MAX 100 + 2
struct Area{
int start;
int end;
};
int CompareArea(const void *elem1, const void *elem2)
{
return ((Area*)elem1)->start - ((Area*)elem2)->start;
}
int main()
{
Area area[M_MAX], temp;
int L = 0;
int M = 0;
int count = 0;
scanf("%d%d", &L, &M);
for (int i = 0; i < M; ++i)
{
scanf("%d%d", &area[i].start, &area[i].end);
}
qsort(area, M, sizeof(Area), CompareArea);
temp = area[0];
for (int i = 1; i < M; ++i)
{
if (area[i].start <= temp.end)
{
if (area[i].end > temp.end)
{
temp.end = area[i].end;
}
}
else
{
count += temp.end - temp.start + 1;
temp = area[i];
}
}
count += temp.end - temp.start + 1;
printf("%d\n", L + 1 - count);
return 0;
}
posted on 2011-11-07 13:27 yx 閱讀(652) 評論(0) 編輯 收藏 引用 所屬分類: 解題報告