HDU [1529] || POJ [P1275] Cashier Employment
经典的差分约束+二分答案。
本题的难点在于如何建图。
设x[i] 表示第i个小时可以开始工作的有多少个人。
num[i] 表示第i个小时最少需雇佣多少人。
s[i] 表示1...i小时实际开始工作的有多少人
因为最后要求的是s[24]的最小值,所以我们以s为中心建图。
因为我们求得是最小值,所以都转化成>=号的形式
我们逐步分析题目的已知条件:
- 第i小时实际开始工作的人数应小于等于可以开始的人数,即 $ s[i]-s[i-1]<=x[i] $ 变成 $ s[i-1]-s[i] >=-x[i] $
- 第i小时实际开始工作的人数应大于等于0,即$ s[i]-s[i-1]>=0 $ .
- 第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;
}
HDU [1529] || POJ [P1275] Cashier Employment的更多相关文章
- 图论(差分约束系统):POJ 1275 Cashier Employment
Cashier Employment Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7651 Accepted: 288 ...
- POJ 1275 Cashier Employment(差分约束)
http://poj.org/problem?id=1275 题意 : 一家24小时营业的超市,要雇出纳员,需要求出超市每天不同时段需要的出纳员数,午夜只需一小批,下午需要多些,希望雇最少的人,给出每 ...
- poj 1275 Cashier Employment
http://poj.org/problem?id=1275 #include <cstdio> #include <cstring> #include <algorit ...
- poj 1275 Cashier Employment - 差分约束 - 二分答案
A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit its n ...
- POJ 1275 Cashier Employment 挺难的差分约束题
http://poj.org/problem?id=1275 题目大意: 一商店二十四小时营业,但每个时间段需求的雇员数不同(已知,设为R[i]),现有n个人申请这份工作,其可以从固定时间t连续工作八 ...
- [HDU 1529]Cashier Employment(差分约束系统)
[HDU 1529]Cashier Employment(差分约束系统) 题面 有一个超市,在24小时对员工都有一定需求量,表示为\(r_i\),意思为在i这个时间至少要有i个员工,现在有n个员工来应 ...
- hdu 1529 Cashier Employment(差分约束)
Cashier Employment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【POJ 1275】 Cashier Employment(差分约束系统的建立和求解)
[POJ 1275] Cashier Employment(差分约束系统的建立和求解) Cashier Employment Time Limit: 1000MS Memory Limit: 10 ...
- POJ1275 Cashier Employment[差分约束系统 || 单纯形法]
Cashier Employment Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7997 Accepted: 305 ...
随机推荐
- 南阳理工oj_The Triangle
The Triangle 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 ...
- jsp的内置对象
JSP内置对象即无需声明就可以直接使用的对象实例,在实际的开发过程中,比较常用的JSP对象有request,response,session,out和application等,笔者在本文章中将简单介绍 ...
- XYZZY(spfa求最长路)
http://acm.hdu.edu.cn/showproblem.php?pid=1317 XYZZY Time Limit: 2000/1000 MS (Java/Others) Memor ...
- 大白话说Java泛型(二):深入理解通配符
文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(二):深入理解通配符> 上篇文章<大白话说Java泛型(一):入门.原理.使用>,我们讲了泛型的产生缘由以及 ...
- koala 编译scss不支持中文(包括中文注释),解决方案如下
进入Koala安装目录,例如:C:\Program Files (x86)\Koala\rubygems\gems\sass-3.4.9\lib\sass 找到engine.rb文件,在该文件中找到最 ...
- UEP-下拉
uep建立下拉 静态下拉: ①private Map<String,String> beanMap = new HashMap<String,String>(); //gett ...
- N的N次方
题目描述 现给你一个正整数N,请问N^N的最左边的数字是什么? 输入 输入包含多组测试数据.每组输入一个正整数N(N<=1000000). 输出 对于每组输入,输出N^N的最左边的数字. 样例输 ...
- 提交到svn服务器时,一直缓冲不,
1,服务器端url问题,正常:https://192.168.1.102:8443/svn/dedegls/ 错误:https:// ...
- hasResultError
hasResultError 的作用是 让返回的对象可以报错误信息.
- eclipse出现错误:he type java.util.Map$Entry cannot be resolved. It is indirectly referenced
eclipse出现错误:he type java.util.Map$Entry cannot be resolved. It is indirectly referenced jre 换成6的就好了选 ...