POJ1275Cashier Employment(查分约束系统)

本文介绍了一个关于超市员工调度的问题,通过构建最短路径算法解决每天24小时内的员工需求问题,确保每个时段都有足够的员工上班。

链接1275Cashier Employment

题目大意就是说有一些人来应聘一个超级市场的工作,每个人的应聘的起始时间在0~23时之间,而超市在时间i需要R[i]个工作人员,而每个人的工作时间都是8小时,问最少需要多少人使得超市一天24小时满足超市的工作人数的需要。

设工作时间为1~24时,S[i]表示前i个小时所需要的工作人数的最小值,那么结果就可以表示成0为起点,24为终点的最短路。下面是约束不等式:

0<=S[i] - S[i-1]<= t[i]               (1<=i<=24)

S[i] - S[i-8] >= R[i]                    (8<=i<=24)

S[i] + S[24] - S[i+16] >= R[i]    (0<=i<=7)

整理之后:

S[i] - S[i-1] >= 0                       (1<=i<=24)

S[i-1] - S[i] >= -t[i]                   (1<=i<=24)

S[i] - S[i-8] >= R[i]                    (8<=i<=24)

S[i] - S[i+16] >= R[i] - S[24]      (0<=i<=7)

这样按照A-B >= W就可以建一些由B指向A的权值为W的有向边,求最长路。

或则是A指向B的权值为-W的有向边,并求其最短路。

另外,由于上图中S[24]是不知道的,所以枚举它就行,我是二分枚举的。

数据比较水(只有24个小时),用Bellman-Ford即可:

  1 #include <map>
  2 #include <set>
  3 #include <stack>
  4 #include <queue>
  5 #include <cmath>
  6 #include <ctime>
  7 #include <vector>
  8 #include <cstdio>
  9 #include <cctype>
 10 #include <cstring>
 11 #include <cstdlib>
 12 #include <iostream>
 13 #include <algorithm>
 14 using namespace std;
 15 #define eps 1e-15
 16 #define MAXN  25
 17 #define INF 1000000007
 18 #define MAX(a,b) (a > b ? a : b)
 19 #define MIN(a,b) (a < b ? a : b)
 20 #define mem(a) memset(a,0,sizeof(a))
 21 
 22 struct EDGE
 23 {
 24     int v;
 25     int w;
 26     int next;
 27 }edge[3*MAXN];
 28 int head[MAXN], d[MAXN],tot,T,N,R[MAXN],t[MAXN],ans,x;
 29 
 30 bool Bellman_Ford(int s)
 31 {
 32     for(int i=0;i<=24;i++) d[i] == (i==s)?0:INF;
 33     for(int k=1;k<=24;k++)
 34     {
 35         for(int i=0;i<=24;i++)
 36         {
 37             for(int e = head[i];d[i]!=INF && e!=-1;e=edge[e].next)
 38             {
 39                 if(d[edge[e].v]>d[i]+edge[e].w)
 40                 {
 41                     d[edge[e].v] = d[i] + edge[e].w;
 42                 }
 43             }
 44         }
 45     }
 46     for(int i=0;i<=24;i++)
 47     {
 48         for(int e = head[i];d[i]!=INF && e!=-1;e=edge[e].next)
 49         {
 50             if(d[edge[e].v]>d[i]+edge[e].w)return false;
 51         }
 52     }
 53     return true;
 54 }
 55 
 56 void AddEdge(int u,int v,int w)
 57 {
 58     edge[tot].v = v;
 59     edge[tot].w = w;
 60     edge[tot].next = head[u];
 61     head[u] = tot++;
 62 }
 63 
 64 void BuildGragh(int NumOfPer)//由于每次总人数都不一样,所以需要重新建图
 65 {
 66     tot = 0;   mem(edge); memset(head,-1,sizeof(head));
 67     for(int i=1;i<=24;i++){AddEdge(i-1,i,t[i]); AddEdge(i,i-1,0);}
 68     for(int i=8;i<=24;i++) AddEdge(i,i-8,-R[i]);
 69     for(int i=0;i<=7;i++) AddEdge(i,i+16,NumOfPer-R[i]);
 70     AddEdge(24,0,-NumOfPer);
 71 }
 72 
 73 
 74 void BSearch(int low,int high)//对总人数二分
 75 {
 76     if(low > high)return ;
 77     int mid = (low + high) / 2;
 78     BuildGragh(mid);
 79     if(Bellman_Ford(0))//表示可以找到一种解决方案
 80     {
 81         ans = mid;
 82         BSearch(low, mid-1);
 83     }
 84     else
 85     {
 86         BSearch(mid+1,high);
 87     }
 88 }
 89 
 90 int main()
 91 {
 92     while(~scanf("%d", &T))while(T--)
 93     {
 94 
 95         mem(R);  mem(t);
 96         for(int i=1;i<=24;i++)
 97         {
 98             scanf("%d", &R[i]);
 99         }
100         scanf("%d", &N);
101         for(int i=0;i<N;i++){ scanf("%d", &x); t[x+1]++;}
102         ans = -1;
103         BSearch(1,N);
104         if(ans == -1) printf("No Solution\n");
105         else printf("%d\n",ans);
106     }
107     return 0;
108 }

 

转载于:https://www.cnblogs.com/gj-Acit/p/3264967.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值