贪心算法之会场安排问题

【问题描述】

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数。)

【数据输入】

由文件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;
}

 

 

posted @ 2018-05-04 20:58  木&子  阅读(3853)  评论(0编辑  收藏  举报