貪心法-求解畜欄問題


題目內容:

有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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM