題目內容:
有n頭牛(1<=n<=50,000)要擠奶。給定每頭牛擠奶的時間區間[A,B](1<=A<=B<=1,000,000,A,B為整數)。牛需要呆在畜欄里才能擠奶。一個畜欄同一時間只能容納一頭牛。問至少需要多少個畜欄,才能完成全部擠奶工作,以及每頭牛都放哪個畜欄里?注意:在同一個畜欄的兩頭牛,它們擠奶時間區間不能在端點重合。
輸入格式:
第1行:一個正整數N;
第2..N+1行:第i+1行的兩個整數給出第i頭奶牛的擠奶時間。
輸出格式:
第1行:需要畜欄的最小數;
第2..N+1行:第i+1行表示第i頭奶牛被分配到的畜欄序號
以上為題目要求。
下面做簡要的分析,對於第一頭牛,一定可以放在畜欄中,將其放在第一個畜欄里。對於第二頭牛,若與第一頭牛擠奶時間重合,則放入第二個畜欄,畜欄數加一,反之放入第一個畜欄,個數不變。
由此,作為一個貪心的人,對於每頭牛,我們需要從已放入畜欄的第一頭牛開始,依次對比是否擠奶時間重合,由於可能有多頭牛在同一個畜欄,我們可以建立一個標記數組,將數組元素置零,如果該牛與第i頭牛時間重合,則將標記數組中以第i頭牛對應的畜欄編號為序的元素置為1,循環找出無重合發生的畜欄。
具體代碼如下:
1 #include<stdio.h> 2 #define MAXSIZE 100 3 int setting(int t[MAXSIZE][2],int s[],int n); 4 int main() 5 { 6 int t[MAXSIZE][2]; 7 int n; 8 scanf("%d",&n); 9 for(int i=0;i<n;i++) 10 { 11 scanf("%d%d",&t[i][0],&t[i][1]); 12 } 13 // for(int i=0;i<n;i++) 14 // { 15 // printf("%d %d\n",t[i][0],t[i][1]); 16 // } 17 int s[MAXSIZE]={0};//用於存儲分配畜欄號 18 printf("%d\n",setting(t,s,n)); 19 for(int i=0;i<n;i++) 20 { 21 printf("%d\n",s[i]); 22 } 23 return 0; 24 } 25 int setting(int t[MAXSIZE][2],int s[],int n) 26 { 27 int m=0;//畜欄個數 28 s[0]=1; 29 m++; 30 for(int i=1;i<n;i++) 31 { 32 int h[MAXSIZE]={0}; 33 for(int k=0;k<i;k++) 34 { 35 if(t[k][0]<=t[i][1]&&t[k][1]>=t[i][0]) 36 h[k]=1;//如果出現重合,則置1 37 } 38 for(int k=0;k<=i;k++) 39 { 40 if(k==i) 41 { 42 s[i]=++m; 43 } 44 else 45 { 46 if(h[k]==0) 47 { 48 s[i]=s[k]; 49 break; 50 } 51 } 52 } 53 } 54 return m; 55 }
結果如下:
輸入樣例: 5 1 10 2 4 3 6 5 8 4 7 輸出樣例: 4 1 2 3 2 4