貪心算法之會場安排問題


【問題描述】

假設要在足夠多的會場里安排一批活動,並希望使用盡可能少的會場。(這個問題實際上是著名的圖着色問題。若將每一個活動作為圖的一個頂點,不相容活動間用邊相連。使相鄰頂點有不同顏色的最小着色數,相應於要找的最小會場數。)

【數據輸入】

由文件input.txt給出輸入數據,第一行又一個正整數K,表示有K個待安排的活動。

接下來有K行數據,每行有兩個正整數,分別表示K個待安排的活動的開始時間和結束時間。

 

【結束輸出】

輸出最少會場數。

 

input.txt       output.txt

5                   3

1 23

12 28

25 35

27 80

36 50

 

來吧,幫你解決介個問題。。。。。。

思路:

按照俺的思路啊~遍歷所有的活動時間,設一個int sum代表會場的個數,如果時間可疊加到前面已有活動的會場的,把活動加到已有會場的數組中;如不可疊加,則新加會場重新加一個數組把這個新會場加入到新數組中然后sum+1。

遍歷到最后 sum則就是需要最少的會場的個數·····

下次再來。。。。。。

 

我回來了,上面的思路我嘗試了,沒試出來。。。。。。

就換了一種思路,就是做標記,已經加入的會場標記為1 否則為0  就OK了

代碼下次貼上

 

#include <stdio.h>
#define LEN 6
int sum=0;
int mark[LEN];

void squarePlan(int s[],int f[])
{
 int k=1,j;
 int flag=1;
 mark[0]=mark[1]=1;
 while(flag==1)
 {
  mark[k]=1;
  for(int m=k+1;m<=LEN;m++)
  {
   if(mark[m]==0&&s[m]>=f[k])
   {
    mark[m]=1;
    k=m;
   }
  }
  sum++;
  for(j=2;j<LEN;j++)
  {
   if(mark[j]==0){
    k=j;
    break;
   }
  }
 
  flag=0;
  for(int i=1;i<LEN;i++)
  {
   if(mark[i]==0&&i!=j){
    flag=1;
    break;
   }
  }
 }
}

int main()
{ int s[LEN],f[LEN];
 int n;
 FILE *fp_in,*fp_out;
 fp_in=fopen("input.txt","r");//打開一個輸入流,讀取input.txt文件 
    fp_out=fopen("output.txt","w");//打開一個輸出流,寫output.txt文件 
    if(fp_in==NULL) 
    { 
        printf("open in file failed\n"); 
        return 0; 
    } 
    if(fp_out==NULL) 
    { 
        printf("open out file failed\n"); 
        return 0; 
    } 
    fscanf(fp_in,"%d",&n); 
    s[0]=0;
 f[0]=0;
    for(int i=1;i<=n;i++){ 
            fscanf(fp_in,"%d",&s[i]);//x坐標在此題中無用,而y坐標在x坐標之后寫入。因此兩次寫入一樣的數組y[LEN] 
            fscanf(fp_in,"%d",&f[i]);
   mark[i]=0;
    } 
         
 squarePlan(s,f);
  printf("%d",sum);
 fprintf(fp_out,"%d\n",sum);
 fclose(fp_in);//關閉輸入流 
    fclose(fp_out);//關閉輸出流 
 return 0;
}

 

 


免責聲明!

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



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