首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求教值班排班算法
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ConverseMe
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-24 00:45:10 楼主
    有五个小组,每天有四个班组分别在四个不同的时间段在值班,剩下一个小组在休息或者学习

    值班的时间段是这样的:
    早班: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天的情况有与第一天的一样
    ------------------------------------------

    有哪位高手能够赐教小弟一下不???
    感激不尽哪.....


    大概的可以这么想
          1 2 3 4 5 6 7 8 9 10
    早班
    上午班
    下午班
    晚班

    用 A B C D E 分别表示班组
    则 每一行 的 ABCDE 都会咯出现两次
    每一列 出现 ABCDE中的四个
    且 晚班 跟下一列的早班 不能是同一个字母
    10列 的晚班对应的就是 1 列的早班,不能相同
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bhn147123
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 09:13:561楼 得分:0
    我怎么看着题目是这个意思啊~
          1  2  3  4  5  6  7  8  9  10  11  12 ...
    第1组:早2 休息 晚1 晚2 下1 下2 上1 上2 学习 早1 早2 休息 ...
    第2组:学习 早1 早2 休息 晚1 晚2 下1 下2 上1 上2 学习 早1 ...
    第3组:上1 上2 学习 早1 早2 休息 晚1 晚2 下1 下2 上1 上2 ...
    第4组:下1 下2 上1 上2 学习 早1 早2 休息 晚1 晚2 下1 下2 ...
    第5组:晚1 晚2 下1 下2 上1 上2 学习 早1 早2 休息 晚1 晚2 ...
    具体要编写一个轮值班表查询程序 ,没搞清楚是什么概念~是不是说可以查询某一天这5个组的轮班情况,该上什么班?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiju8484
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 12:54:012楼 得分:0
    lz看下图论中的点边着色问题吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • NCF_BJ
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-26 15:46:173楼 得分:0
    #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;
    }


    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved