整數區間
阿新 • • 發佈:2018-03-17
namespace != += i++ tdi csharp 行集 cin pac
整數區間 【題目描述】 一個整數區間[A,B] 請編程完成以下任務: 1.從文件中讀取區間的個數及其它們的描述; 2.找到滿足下述條件的所含元素個數最少的集合中元素的個數,對於每一個區間,都至少有兩個不同的整數屬於該集合。 【輸入】 首行包括區間的數目n,1<=n<=10000,接下來的n 行,每行包括兩個整數a,b,被一空格隔開,0<=a<=b<=10000,它們是某一個區間的開始值和結束值。 【輸出】 第一行集合元素的個數,對於每一個區間都至少有兩個不同的整數屬於該區間,且集合所包含元素數目最少。 樣例輸入 4 3 6 2 4 0 2 4 7 樣例輸出 4
其實o(n^2)的算法很好想,但o(n)就比較狗了。主要思路就是兩個變量f1,f2,假設取這兩個點。剩下看代碼。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct node{ int a; int b; }; node m[1000]; bool cmp(node a,node b) //頭從小到大排序 { if(a.a != b.a) { return a.a < b.a; } else return a.b < b.b; } int main() { int n,f1,f2,tot = 0; cin>>n; for(int i = 1;i <= n;i++) { cin>>m[i].a>>m[i].b; } sort(m + 1,m + n + 1,cmp); f1 = m[n].a; f2 = m[n].a + 1; tot += 2; for(int i = n - 1;i > 0;i--) { if(m[i].b < f1) //兩區間分離,則同時改變f1,f2,f1 = 頭;f2 = 頭+1; { tot += 2; f1 = m[i].a; f2 = f1 + 1; } else if(m[i].b < f2) //兩區間重合,f2 = 原來的f1,f1 = 現在區間的頭 { tot ++; f2 = f1; f1 = m[i].a; } } cout<<tot<<endl; return 0; } /* 4 3 6 2 4 0 2 4 7 */
整數區間