经典的差分约束+二分答案。
本题的难点在于如何建图。
设x[i] 表示第i个小时可以开始工作的有多少个人。
num[i] 表示第i个小时最少需雇佣多少人。
s[i] 表示1...i小时实际开始工作的有多少人
因为最后要求的是s[24]的最小值,所以我们以s为中心建图。
因为我们求得是最小值,所以都转化成>=号的形式
我们逐步分析题目的已知条件:

  1. 第i小时实际开始工作的人数应小于等于可以开始的人数,即 $ s[i]-s[i-1]<=x[i] $ 变成 $ s[i-1]-s[i] >=-x[i] $
  2. 第i小时实际开始工作的人数应大于等于0,即$ s[i]-s[i-1]>=0 $ .
  3. 第i小时实际工作的人数应大于等于最少需雇佣的人数,即 $ s[i]-s[i-8]>=x[i] $ .
    当i>=8 时,$ s[i]-[i-8]>=x[i] $
    当i<8 时,$ s[24]+s[i]-s[i+16]>=x[i] $
    我们发现上式有三个变量,不符合差分约束的基本形式,我们可以二分答案,将上式变为 $ s[i]-s[i+16]>=x[i]-ans $
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <ctime>
#define RST(a) memset((a),0,sizeof((a)))
using namespace std;
const int MAXN=50005;
int init(){int rv=0,fh=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') fh=-1;c=getchar();}while(c>='0'&&c<='9'){rv=(rv<<1)+(rv<<3)+c-'0';c=getchar();}return fh*rv;
}
struct edge{int to,nxt,dis;
}e[MAXN];
int T,head[MAXN],num[30],pre[30],x[30],nume,dis[30];
void adde(int from,int to,int dis){e[++nume].to=to;e[nume].dis=dis;e[nume].nxt=head[from];head[from]=nume;
}
bool SPFA(){for(int i=0;i<=29;i++) dis[i]=-0x3f3f3f3f;bool f[30];int cnt[30];RST(f);RST(cnt);queue <int> q;q.push(24);dis[24]=0;f[24]=1;while(!q.empty()){int u=q.front();q.pop();f[u]=0;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(dis[v]<dis[u]+e[i].dis){dis[v]=dis[u]+e[i].dis;if(!f[v]){q.push(v);f[v]=1;cnt[v]++;if(cnt[v]>=23) return 0; }}}}if(dis[0]==-0x3f3f3f3f) return 0;else return 1;
}
bool check(int mid){RST(e);RST(head);nume=0;RST(dis);for(int i=1;i<=24;i++){adde(i-1,i,0);adde(i,i-1,-x[i]);if(i>=8){adde(i-8,i,num[i]);}}for(int i=0;i<8;i++){adde(i+16,i,num[i]-mid);}if(SPFA()) return 1;else return 0;
}
int main(){//freopen("in.txt","r",stdin);srand(time(NULL));T=init();while(T--){RST(num);RST(x);RST(dis);RST(head);RST(e);nume=0;RST(pre);for(int i=0;i<=23;i++) num[i]=init();int n=init();for(int i=1;i<=n;i++){int t=init();x[t]++;}pre[0]=x[0];for(int i=1;i<=23;i++){pre[i]=pre[i-1]+x[i];}int l=0,r=n,mid=0;while(l<=r){mid=(l+r)/2;if(check(mid)){r=mid-1;}else l=mid+1;}if(l>=n) printf("No Solution\n");else printf("%d\n",l);}//fclose(stdin);return 0;
}

转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8143245.html

HDU [1529] || POJ [P1275] Cashier Employment相关推荐

  1. 扫描线三巨头 hdu1928hdu 1255 hdu 1542 [POJ 1151]

    学习链接:http://blog.csdn.net/lwt36/article/details/48908031 学习扫描线主要学习的是一种扫描的思想,后期可以求解很多问题. 扫描线求矩形周长并 hd ...

  2. 【差分约束】 HDOJ 1529 Cashier Employment

    引用一下POJ的discuss里的大牛的解释. 详细解释一下. 为避免负数,时间计数1-24.令: R[i] i时间需要的人数 (1<=i<=24) T[i] i时间应聘的人数 (1< ...

  3. 【POJ - 1275】Cashier Employment(差分约束,建图)

    题干: A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit i ...

  4. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

  5. hdu 5023 poj 2777(线段染色)2014 ACM/ICPC Asia Regional 广州 Online

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5023 http://poj.org/problem?id=2777 题意:给出一个长度为N的线段,分 ...

  6. HDU 3966 POJ 3237 HYSBZ 2243 HRBUST 2064 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  7. 【DFS】HDU 1364 POJ 1071 Illusive Chase

    数据水了... 不知道正解是什么 将TOM放在一个0上经过输入的  1 2 R 这样走 还能在图上则这个点可行(走的过程中不能走出图) 求有几个0 可行 直接dfs 完全没有别的思路 题目要求必须 走 ...

  8. HDU 2689 POJ 2299 树状数组 + 离散化

    以前都是直接树状数组裸奔,昨天一个题数据量好大,过不了,没办法只能学离散化,今天A了第一个离散化的题 #include<stdio.h> #include<string.h> ...

  9. hdu 4337——poj 2438(哈密尔顿回路求解模板)

    转:http://imlazy.ycool.com/post.2072698.html Dirac 定理:设一个无向图中有 N 个节点,若所有节点的度数都大于等于 N/2,则汉密尔顿回路一定存在.注意 ...

  10. hdu 3413 poj 3778 Single CPU, multi-tasking

    转载请注明出处:http://blog.csdn.net/u012860063 百度之星编程大赛--您报名了吗?  杭电ACM 2014暑期集训队--选拔安排~ Single CPU, multi-t ...

最新文章

  1. 什么样的电路仿真软件可以显示电流流动?
  2. ObjC block入门
  3. 记一次WiFi芯片W600上串口只能回显的问题
  4. jQuery的选择器分类
  5. Bigtable 论文翻译
  6. 有了Unicode为啥还需要UTF-8
  7. 用jQuery实现banner图片切换
  8. 1001. 害死人不偿命的(3n+1)猜想 (15)-PAT乙级真题
  9. Q101:真实地模拟一个玻璃酒杯(Wine Glass)(回旋曲面)
  10. LeetCode刷题——62. 不同路径
  11. js获取内网ip_WebRTC安全问题:私有IP与mDNS
  12. anaconda查看环境_快速搭建深度学习开发环境(以Pytorch为例)
  13. 抽象类、接口、内部类
  14. 手模手教你装 文能黑苹果,武可3A游戏大作的2400块主机
  15. 自学FPGA第一期:初学FPGA
  16. QQ文件中转站 发送给好友的功能 哪去了?
  17. python和前端哪个好_web前端和python学哪个出来工资高?
  18. win10管理员无法使用mklink的问题
  19. 统计学习三要素个人理解
  20. 对于vue项目中报Disallow self-closing on HTML void elements格式错误时的解决方案

热门文章

  1. 改变计算机界的存储解决方案:RAID,30岁生日快乐!
  2. PAT乙级真题 | 1006 换个格式输出整数
  3. 撩课-Web大前端每天5道面试题-Day2
  4. WPF实现竖向排列并换行显示
  5. 数据库、C#、Java生成唯一GUID 方法
  6. oracle 分组后多行合并为一行
  7. sharepoint 在Visual Studio设置其他页面的加载标签
  8. 返回零长度的数组或者集合,而不是null
  9. HDU 2457 DNA repair(AC自动机 + DP)题解
  10. BZOJ3744 Gty的妹子序列(分块+树状数组)