【問題描述】
假設要在足夠多的會場里安排一批活動,並希望使用盡可能少的會場。(這個問題實際上是著名的圖着色問題。若將每一個活動作為圖的一個頂點,不相容活動間用邊相連。使相鄰頂點有不同顏色的最小着色數,相應於要找的最小會場數。)
【數據輸入】
由文件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;
}