贪心算法之会场安排问题
【问题描述】
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数。)
【数据输入】
由文件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;
}