1. 程式人生 > 實用技巧 >【刷題第十天】貪心三——C++

【刷題第十天】貪心三——C++

1324:【例6.6】整數區間

【題目描述】

請程式設計完成以下任務:

1.讀取閉區間的個數及它們的描述;

2.找到一個含元素個數最少的集合,使得對於每一個區間,都至少有一個整數屬於該集合,輸出該集合的元素個數。

【輸入】

首行包括區間的數目n,1≤n≤10000,接下來的n行,每行包括兩個整數a,b,被一空格隔開,0≤a≤b≤10000,它們是某一個區間的開始值和結束。

【輸出】

第一行集合元素的個數,對於每一個區間都至少有一個整數屬於該區間,且集合所包含元素數目最少。

【輸入樣例】

4
3 6
2 4
0 2
4 7

【輸出樣例】

2

【題目分析】

其實這道題很簡單,難的是題目的意思。其實就是找到最少的幾個數能夠包含於所有的區間。

就像例題:數字2和6這兩個數,每個區間裡至少包含一個數。

怎麼做呢,其實很簡單,先對每個區間根據末區間的大小進行排序(從小到大),然後從頭開始,用上一個的末尾判斷是否在下一個區間裡,如果在,那麼還是用上一個的末尾判斷是否在下下一個區間裡……,如果不在,元素數目加一,用不在的那個末尾繼續判斷。

比如:紅色的第一個數的比較,用第一個的末尾數和第二個區間比較,在區間內,那麼和第三個區間比較,不在區間內,那麼就用第三個的末尾數和下面的區間繼續比較,得出是2和6這兩個數。(輸出是個數2)

 1 #include <iostream>
 2 #include <algorithm>
 3
using namespace std; 4 5 typedef struct My { 6 int start; 7 int end; 8 }Qu; 9 int cmp(Qu a, Qu b); 10 11 int main() { 12 Qu qujian[10000]; 13 int n, a = 0, sum = 1; 14 bool f; 15 cin >> n; 16 for (int i = 0; i < n; i++) 17 { 18 cin >> qujian[i].start >> qujian[i].end;
19 } 20 sort(qujian, qujian + n, cmp); //排序 21 for (int i = 1; i < n; i++) 22 { 23 if (qujian[a].end >= qujian[i].start && qujian[a].end <= qujian[i].end) { //判斷末尾數是不是在區間內 24 continue; 25 } 26 else 27 { 28 a = i; 29 sum++; 30 } 31 } 32 cout << sum; 33 return 0; 34 } 35 36 int cmp(Qu a, Qu b) { 37 return a.end < b.end; 38 }