#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#define N 50
#define TURE 1
#define FALSE 0
int s[N],f[N],A[N];
int Partition(int *b,int *a,int p,int r);
void QuickSort(int *b,int *a,int p,int r);
void GreedySelector(int n,int *s,int *f,int *A);
int main()
{
int n=0,i;
while(n<=0||n>50)
{
printf("请输入活动的个数,n=");
scanf("%d",&n);
if(n<=0) printf("请输入大于零的数!");
else if(n>50) printf("请输入小于50的数!");
}
for(i=1;i<=n;i++)
{
printf("请输入第%d个活动开始的时间,s[%d]=",i,i);
scanf("%d",&s[i]);
f[i]=s[i]+1+rand()%(24-s[i]); /*自动产生结束时间*/
}
printf("/n/n活动号i/t开始时间 结束时间/n"); /*输出输入数据*/
printf("-------------------------/n");
for(i=1;i<=n;i++)
printf(" %d/t %d/t %d/n",i,s[i],f[i]);
printf("-------------------------/n/n");
//getch();
QuickSort(s,f,1,n);
printf("排完顺序之后为:/n(注:序号与活动号不同!)"); /*输出排序结果*/
printf("/n 序号/t开始时间 结束时间/n");
printf("-------------------------/n");
for(i=1;i<=n;i++)
printf(" %d/t %d/t %d/n",i,s[i],f[i]);
printf("-------------------------/n");
//getch();
GreedySelector(n,s,f,A);
printf("安排的活动序号依次为:");
for(i=1;i<=n;i++)
{
if(A[i]) printf("/n%d %d-->%d",i,s[i],f[i]);
}
printf("/n按任意键退出!");
system("pause");
// getch();
return 0;
}
void QuickSort(int *b,int *a,int p,int r) /*快速排序*/
{int q;
if(p<r){
q=Partition(b,a,p,r);
QuickSort(b,a,p,q-1);/*对左半段排序*/
QuickSort(b,a,q+1,r);/*对右半段排序*/
}
}
int Partition(int *b,int *a,int p,int r) /*产生中间数*/
{
int k,m,y,i=p,j=r+1;
int x=a[p];y=b[p];
while(1){
while(a[++i]<x);
while(a[--j]>x);
if(i>=j)break;
else
{
k=a[i];a[i]=a[j];a[j]=k;
m=b[i];b[i]=b[j];b[j]=m;
}
}
a[p]=a[j];b[p]=b[j];
a[j]=x;b[j]=y;
return j;
}
void GreedySelector(int n,int *s,int *f,int *A) /*贪婪算法实现活动选择*/
{ int i,j;
A[1]=TURE;
j=1;
for(i=2;i<=n;i++)
{
if(s[i]>=f[j])
{
A[i]=TURE;
j=i;
}
else A[i]=FALSE;
}
}