甘特图(Gantt chart)又称为
横道图、条状图(Bar chart)。以提出者亨利·L·甘特先生的名字命名。
甘特图内在思想简单,即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的活动顺序与持续时间。基本是一条线条图,
横轴表示时间,
纵轴表示活动(项目),线条表示在整个期间上计划和实际的活动完成情况。它直观地表明任务计划在什么时候进行,及实际进展与计划要求的对比。管理者由此可便利地弄清一项任务(项目)还剩下哪些工作要做,并可评估工作进度。
#include<algorithm>
using namespace std;
typedef struct tagSltem
{
int t;
int nIndex;
bool bFirst;
bool operator < (struct tagSltem& item) const
{
return t < item.t;
}
} Sltem;
void GanttChart(const int *a, const int *b, int *c, int size)
{
int i;
int s2=2*size;
//整理数据
Sltem* pltem=new Sltem[s2]; //0~size个为执行任务1的时间,size~2*size为执行任务2的时间
for(i=0;i<size;i++)
{
pltem[i].t=a[i];
pltem[i].nIndex=i;
pltem[i].bFirst=true;
pltem[size+i].t=b[i];
pltem[size+i].nIndex=i;
pltem[size+i].bFirst=false;
}
sort(pltem,pltem+s2);
bool* bArrage = new bool[size];//d[i]:第i号已经安排
for(i=0;i<size;i++)
bArrage[i]=false;
int from=0;
int to=size-1;
for(i=0; i<s2; i++)
{
if(bArrage[pltem[i].nIndex])//pltem[i].nIndex已经确定
continue;
bArrage[pltem[i].nIndex]=true;
if(pltem[i].bFirst)//策略:最小的时间是第一个任务则先执行
{
c[from]=pltem[i].nIndex;
from++;
}
else //策略:最小的时间是第二个任务则放在尾部
{
c[to]=pltem[i].nIndex;
to--;
}
if(to-from<0)//提前退出
break;
}
delete[] pltem;
delete[] bArrage;
}
void Print(int *c,int n)
{
for(int i=0; i<n; i++)
{
cout<<*(c+i)<<" ";
}
}
int main()
{
int a[]={8,6,2,4};
int b[]={3,1,3,12};
int n=sizeof(a)/sizeof(int);
int *c=new int[n];
GanttChart(a,b,c,n);//Gantt图
Print(c,n);
delete[] c;
return 0;
}