1. 程式人生 > >求區間段數問題-貪心思想

求區間段數問題-貪心思想

一個 ott ret def 目標 排序 n) des 定義

Problem Description(hdu2037,水題)

“今年暑假不AC?”
“是的。”
“那你幹什麽呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”
確實如此,世界杯來了,球迷的節日也來了,估計很多ACMer也會拋開電腦,奔向電視了。
作為球迷,一定想看盡量多的完整的比賽,當然,作為新時代的好青年,你一定還會看一些其它的節目,比如新聞聯播(永遠不要忘記關心國家大事)、非常6+7、超級女生,以及王小丫的《開心辭典》等等,假設你已經知道了所有你喜歡看的電視節目的轉播時間表,你會合理安排嗎?(目標是能看盡量多的完整節目) Input 輸入數據包含多個測試實例,每個測試實例的第一行只有一個整數n(n<=100),表示你喜歡看的節目的總數,然後是n行數據,每行包括兩個數據Ti_s,Ti_e (1<=i<=n),分別表示第i個節目的開始和結束時間,為了簡化問題,每個時間都用一個正整數表示。n=0表示輸入結束,不做處理。 Output 對於每個測試實例,輸出能完整看到的電視節目的個數,每個測試實例的輸出占一行。 Sample Input 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0 Sample Output 5 思路:各個區間段可能會重復,優先選最短時間的話,(0,3)(2,4)(3,6)三個會優先選中間那個,明顯答案是錯的,如果優先選最早開始的,(0,15)(1,2)(3,4)明顯出錯,如果優先選最少重疊的也會出錯,反例如下:(時間從左到右增加)
............... ........... ............... ........... ............... ................ ........... ............ ............. .............. .............. 按照這個優先選法,也會出錯。正確的選法是,優先選結束時間最早的。 AC代碼:
#include<stdio.h>
#include
<math.h> #include<string.h> #include<algorithm> #include<string> #include<iostream> using namespace std; #define ll long long struct node { int sta; int over; }; node a[105]; bool cmp(node p1,node p2) { if(p1.over<p2.over) return true; return false; }
int main() { int n,t,num; while(scanf("%d",&n)!=EOF && n) { for(int i=0;i<n;i++) scanf("%d%d",&a[i].sta,&a[i].over); sort(a,a+n,cmp);///自定義函數排序,結束時間早的排在前面 t=num=0;///t為節目的結束時間 for(int i=0;i<n;i++) { if(a[i].sta>=t)///如果下一個節目開始時間在上一個結束時間之後,就可以優先選擇 { t=a[i].over; num++; } } printf("%d\n",num); } }

求區間段數問題-貪心思想