值班算法!!急!

test_code1 2008-08-24 12:03:25
总共有五个小组,每天有四个小组分别在一天中的四个不同的时间段值班,剩下一个小组在休息或者学习

值班的时间段是这样的:
早班:2:00-8:00
上午班:8:00-14:00
下午班:14:00-20:00
晚班:20:00-2:00

十天为一个轮次,
而且不能出现同一个小组在用一天值班两次,
同一个小组不能值了某天的晚班,立即又值下一天的早班
所以是十天中 每个小组分别要值两次每个时间段的班

----------------------------------------
具体的原题目如下:
要求编写一个轮值班表查询程序,要求如下:
值班以10天为一个单位,就是每个10天班次就会重复一次,这10天是如下分配的:
第1天:休息(不上班)
第2天:第一个晚班(当天20:00到第2天02:00)
第3天:第二个晚班(当天20:00到第2天02:00)
第4天:第一个下午班(当天14:00到20:00)
第5天:第二个下午班(当天14:00到20:00)
第6天:第一个上午班(当天8:00到14:00)
第7天:第二个上午班(当天8:00到14:00)
第8天:学习
第9天:第一个早班(当天2:00到8:00)
第10天:第二个早班(当天2:00到8:00)
因为需要24小时值班,所以分为4个时间段,即晚班,下午班,上午班和早班,时间段如上面括号中所标注的时间为准。而所有值班人员分为5个班,每天只有4个在上班,而另外一个在学习或休息。
这5个班分别称为“一班组,二班组,三班组,四班组,五班组”;
现在假定2004年3月11日值班情况如下:
一班组:第二个早班
二班组:学习
三班组:第一个上午班
四班组:第一个下午班
五班组:第一个晚班
那么2004年3月12日,就是第二天:
一班组:休息
二班组:第一个早班
三班组:第二 个上午班
四班组:第二个下午班
五班组:第二个晚班
那么2004年3月13日,就是第三天:
一班组:第一个晚班
二班组:第二个早班
三班组:学习
四班组:第一个上午班
五班组:第一个下午班
依次类推 共10天 。。第11天的情况有与第一天的一样
------------------------------------------

有哪位高手能够赐教小弟一下不???
感激不尽哪.....
...全文
126 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
NCF_BJ 2008-08-26
  • 打赏
  • 举报
回复
#include<iostream>
#include<string>
using namespace std;
int getDays1(int year,int month,int day)
{
int days=0;
int monthX=1;
while(monthX<month)
{
switch(monthX)
{
case 1:days+=31;break;
case 2:days+=28;break;
case 3:days+=31;break;
case 4:days+=30;break;
case 5:days+=31;break;
case 6:days+=30;break;
case 7:days+=31;break;
case 8:days+=31;break;
case 9:days+=30;break;
case 10:days+=31;break;
case 11:days+=30;break;
case 12:days+=31;break;
}
if((year%400==0||(year%4==0 && year%100!=0)) && monthX==2)days+=1;
monthX++;

}
days+=day;
return days;
}

int getDays2(int oldYear,int year)
{
int days=0;
int yearX=year;
while(oldYear<yearX)
{
if(oldYear%400==0||(oldYear%4==0 && oldYear%100!=0))days+=366;
else days+=365;
oldYear++;
}
return days;
}

void work(int marginTime,int workSituation,int team)
{
workSituation=(marginTime+workSituation)%10;
enum work{rest,workAtNight1,workAtNight2,work_pm1,work_pm2,work_am1,
work_am2,study,workMorning1,workMorning2};
work work_Situation;
work_Situation=work(workSituation);

switch(team)
{
case 1:cout<<"一班组:";break;
case 2:cout<<"二班组:";break;
case 3:cout<<"三班组:";break;
case 4:cout<<"四班组:";break;
case 5:cout<<"五班组:";break;
};

switch(work_Situation)
{
case rest:cout<<"休息"<<endl;break;
case workAtNight1:cout<<"第一个晚班"<<endl;break;
case workAtNight2:cout<<"第二个晚班"<<endl;break;
case work_pm1:cout<<"第一个下午班"<<endl;break;
case work_pm2:cout<<"第二个下午班"<<endl;break;
case work_am1:cout<<"第一个上午班"<<endl;break;
case work_am2:cout<<"第二个上午班"<<endl;break;
case study:cout<<"学习"<<endl;break;
case workMorning1:cout<<"第一个早班"<<endl;break;
case workMorning2:cout<<"第二个早班"<<endl;break;
}

}

int main()
{
int team[5];
int workSituation[5];
int year ,month,day;
int marginTime;
for(int i=0;i<5;i++)
team[i]=i+1;
workSituation[0]=9;
workSituation[1]=7;
workSituation[2]=5;
workSituation[3]=3;
workSituation[4]=1;

cout<<"**************请输入要查询的日期***********"<<endl;
cout<<"year"<<endl;
cin>>year;
cout<<"month"<<endl;
cin>>month;
cout<<"day"<<endl;
cin>>day;

marginTime=getDays1(year,month,day)+getDays2(2004,year)-getDays1(2004,3,11);
cout<<marginTime<<endl;

cout<<endl;
cout<<endl;
cout<<endl;
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;

for(int j=0;j<5;j++)
{
work(marginTime,workSituation[j],team[j]);
}

return 0;
}








  • 打赏
  • 举报
回复
就你给出的五个小组四个时间段来说,由于4和5是互质的,所以满足要求的排班很简单:
1 2 3 4 | 5 1 2 3 | 4 5 1 2 | 3 4 5 1 | 2 3 4 5
1 2 3 4 | 5 1 2 3 | 4 5 1 2 | 3 4 5 1 | 2 3 4 5
Super.Jiju 2008-08-24
  • 打赏
  • 举报
回复
着色算法

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧