【刷題第十天】貪心三——C++
阿新 • • 發佈:2020-08-09
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> 3using 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 }