Problem Description
“今年暑假不AC?”
“是的。”
“那你幹什麼呢?”
“看世界盃呀,笨蛋!”
“@#$%^&*%...”
確實如此,世界盃來了,球迷的節日也來了,估計很多ACMer也會拋開電腦,奔向電視了。
作爲球迷,一定想看盡量多的完整的比賽,當然,作爲新時代的好青年,你一定還會看一些其它的節目,比如新聞聯播(永遠不要忘記關心國家大事)、非常6+7、超級女生,以及王小丫的《開心辭典》等等,假設你已經知道了所有你喜歡看的電視節目的轉播時間表,你會合理安排嗎?(目標是能看盡量多的完整節目)
Input
輸入數據包含多個測試實例,每個測試實例的第一行只有一個整數n(n<=100),表示你喜歡看的節目的總數,然後是n行數據,每行包括兩個數據Ti_s,Ti_e (1<=i<=n),分別表示第i個節目的開始和結束時間,爲了簡化問題,每個時間都用一個正整數表示。n=0表示輸入結束,不做處理。
Output
對於每個測試實例,輸出能完整看到的電視節目的個數,每個測試實例的輸出佔一行。
Sample Input
121 33 40 73 815 1915 2010 158 186 125 104 142 90
Sample Output
5
這個題可以用簡單的貪心思想理解,以當前最優解爲每次的選擇。當然這個題可以想到是先把每個節目的結束時間進行升序排序,然後其核心步驟是這樣的:首先默認結束時間最早的節目爲第一個節目,之後將其結束時間與其後結束時間第二早的節目的開始時間進行比較,如果該開始時間早於結束時間則意味着這個節目不完整,故繼續向後找直到開始時間晚於其的第一個完整節目。,然後一直推下去。
代碼如下:
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #define M 10000
- using namespace std;
- struct time
- {
- int s;
- int e;
- };
- bool cmp(time x,time y)//自定義cmp函數對時間的結束點進行排序
- {
- return x.e<y.e;
- }
- int main()
- {
- int i,n;
- time a[M];
- while(cin>>n&&n)
- {
- //memset(a,0,sizeof(a));
- for(i=0;i<n;i++)
- {
- cin>>a[i].s>>a[i].e;
- }
- sort(a,a+n,cmp);
- int end=a[0].e,num=1;//num=1,num的初值是1,即爲第一個作標準的時間段
- for(i=1;i<n;i++)
- {
- if(a[i].s>=end)//判斷後一個時間段的開始時間是否早於前一個時間段
- 的結束時間,若是,將後一個時間段的結束時間賦給end,後面依次循環即可
- {
- num++;
- end=a[i].e;
- }
- }
- cout<<num<<endl;
- }
- return 0;
- }