贪心算法解决会场安排问题。
【问题描述】
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数。)
【数据输入】
由文件input.txt给出输入数据,第一行又一个正整数K,表示有K个待安排的活动。
接下来有K行数据,每行有两个正整数,分别表示K个待安排的活动的开始时间和结束时间。
【结束输出】
输出最少会场数。
input.txt output.txt
5 3
1 23
12 28
25 35
27 80
36 50
思路:遍历所有的活动时间,如果时间可叠加到前面已有活动的会场的,则叠加到已有活动;如不可叠加,则新加会场。
代码:
#include"iostream" #include"string" using namespace std; struct tt { int st; int ed; }; int main() { int n=0; FILE *fp; int num=1; if((fp=fopen("input.txt","r"))==NULL) { printf("Can't find the input.txt\n"); } fscanf(fp,"%d",&n); int *s_t; int *e_t; s_t = (int *)malloc(sizeof(int)*n+1); e_t = (int *)malloc(sizeof(int)*n+1); tt *t_c; t_c =(tt *)malloc(sizeof(tt)*n+1); int i=0; for(i=0;i<n;i++) { fscanf(fp,"%d%d",&s_t[i],&e_t[i]); } for(i=0;i<n;i++) { printf("%3d",s_t[i]); } cout<<endl; for(i=0;i<n;i++) { printf("%3d",e_t[i]); } cout<<endl; int star =1000,end=0; int s_key,e_key; for(i=0;i<n;i++) { if(s_t[i]<=star) { s_key = i; star = s_t[i]; } if(e_t[i]>=end) { e_key = i; end = e_t[i]; } } int count=0; t_c[0].ed = e_t[s_key]; count ++; for(i=0;i<n;i++) { int kk = s_t[i]; if(i==s_key) { continue; } for(int j=0;j<count;j++) { if(t_c[j].ed<kk) { t_c[j].ed = e_t[i]; break; } else { t_c[count].ed = e_t[i]; count++; break; } } } printf("%3d\n",count); return 0; }
时间: 2024-10-10 13:16:32