链接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

POJ1275Cashier Employment(查分约束系统)相关推荐

  1. POJ2983 查分约束系统

    题意:        给你n个点,然后给你两种情况,P a b c,表明a在b的北边c那么远,V a b 表明a在b的北边(距离最少是1),问你这些条件是否冲突. 思路:       一开始想用带权并 ...

  2. 学习笔记 查分约束系统

    定义:如果一个系统由n个变量和m个约束条件组成,形成m个形如 ai - aj ≤ k 的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference cons ...

  3. POJ1275-Cashier Employment【差分约束系统】

    正题 题目链接:http://poj.org/problem?id=1275 题目大意 1∼241\sim 241∼24小时中第iii个小时需要rir_iri​个出纳员 有nnn个人应聘,第iii从x ...

  4. 2021梧州一中高考成绩查询,2021年广西高考成绩查询网站查分网址:https://www.gxeea.cn/...

    [摘要]高考结束后大家最为关心的问题就是在哪里查分,如何查分,高考频道特别整理2021年广西高考成绩查询查分网址,成绩公布时考生可直接点击网址进行查分,预祝大家都能顺利的考上理想的大学! 由于,各省级 ...

  5. 喀什市2021年高考成绩查询,2021年新疆高考查分网站查分网址:http://www.xjzk.gov.cn/...

    [摘要]高考结束后大家最为关心的问题就是在哪里查分,如何查分,高考频道特别整理2021年新疆高考成绩查询查分网址,成绩公布时考生可直接点击网址进行查分,预祝大家都能顺利的考上理想的大学! 由于,各省级 ...

  6. 英语四级计算机准考证查询,四级成绩查询_四级查分:什么?准考证不见了?!!!_沪江英语...

    找回准考证号功能使用说明: 为方便广大考生查询分数,99宿舍提供准考证号找回服务.若你忘记准考证号可通过客服系统提交姓名.学校等信息,99宿舍将为你提供相匹配的准考证号.准考证找回功能仅供参考,准确准 ...

  7. 2021略阳天津高级中学高考成绩查询,2021年天津高考成绩查询网站查分网址:http://www.zhaokao.net/...

    [摘要]高考结束后大家最为关心的问题就是在哪里查分,如何查分,高考频道特别整理2021年天津高考成绩查询查分网址,成绩公布时考生可直接点击网址进行查分,预祝大家都能顺利的考上理想的大学! 由于,各省级 ...

  8. 2021年河北高考生成绩排名查询,2021年河北高考成绩查询网站查分网址:http://www.hebeea.edu.cn/...

    [摘要]高考结束后大家最为关心的问题就是在哪里查分,如何查分,高考频道特别整理2021年河北高考成绩查询查分网址,成绩公布时考生可直接点击网址进行查分,预祝大家都能顺利的考上理想的大学! 由于,各省级 ...

  9. 吉林高考成绩查询2021年几号公布,2021年吉林高考成绩查询时间及查分方式

    2021年吉林高考成绩什么时候公布,几月几号可以查分?吉林高考分数查询时间在6月下旬,具体时间安排及查分方式如下,仅供参考. 2021吉林高考什么时候查分 预计成绩查询时间:6月24日左右 吉林高考成 ...

最新文章

  1. 确定有限状态机和非确定有限状态机详解 包含Java实现源码(Nondeterministic finite automata)
  2. Linux Shell常用技巧(目录)
  3. delphi 保存数据到sql_介绍一款免费好用的可视化数据库管理工具
  4. layUI框架中文件上传前后端交互及遇到的相关问题
  5. 正则表达式提取字符串内所有的img标签下的src路径
  6. python编程数学函数_【编程】Python数学函数
  7. spring的钩子_模板方法模式——看看 JDK 和 Spring 是如何优雅复用代码的
  8. 一款纯HTML二次元响应式引导页
  9. java 远程监控文件系统_Java 文件系统监控(WatchService)
  10. lstm中look_back的大小选择_[Pytorch和Tensorflow对比(二)]:LSTM
  11. [python]一个遍历多层文件夹,然后替换文件内容和目录名称的案例
  12. java paint方法_在Java中,为了使paint()方法执行,以下各项中,()是最佳的调用方法
  13. python编程方式_python的两种编程方式是什么
  14. Xcode8 官方下载地址
  15. java程序的运行结果依赖操作系统吗_SunJava程序员认证考试试题
  16. 继承QPushButton重写MouseEvent后按钮clicked信号不响应
  17. java base64转二进制_使用Java将Base64转换为二进制
  18. 云服务器的出网宽带和入网宽带是什么?
  19. 【分析】云硬盘的Burst功能
  20. java在regedit找不到_Windows找不到文件regedit打不开注册表的解决办法

热门文章

  1. java xml 表达式语言_中级Java开发工程师笔试题
  2. php 可编辑菜单,菜单的添加编辑
  3. python执行脚本时的命令行选项_Python 处理脚本的命令行参数(二):使用click
  4. java 正则比大小_Java:正则表达式模式匹配器是否有大小限制? - java
  5. 在线HTML网页小窗口复制不了,教你一招:解决某些网页不能复制的文字的N种方法!...
  6. SpringSecurity SecurityContextHolderSecurityContext
  7. javacript 布尔型
  8. centos rpm
  9. Citrix,微软,VMware:它们的优缺点(资料整理汇集)
  10. 对象存储 OSS > 开发指南 > 存储类型 > 存储类型介绍