【POJ 1275】 Cashier Employment
【题目链接】
【算法】
设Ti为第i小时有多少个出纳员开始工作,Vi表示第i小时有多少个来应聘的出纳员
那么,有 :
1. 0 <= Ti <= Vi
2. Ti + Ti-1 + Ti-2 + Ti-3 + Ti-4 + Ti-5 + Ti-6 + Ti-7 >= Ri
令Si = T1 + T2 + T3 + ... Ti
则 :
1. Si >= Si-1
2. Si - Si-1 <= Vi
3. Si >= Si-8 + Ri( 8 <= i <= 24)
4. Si>= Si+16 - S24 +Ri (1 <= i <= 7)
所以,我们可以枚举S24,用差分约束系统判断是否可行,枚举可以二分
【代码】
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std; struct Edge
{
int to,w,nxt;
} e[];
int i,n,k,t,l,r,mid,ans,tot,T;
int v[],R[],dis[],head[]; inline void add(int u,int v,int w)
{
tot++;
e[tot] = (Edge){v,w,head[u]};
head[u] = tot;
}
inline bool spfa(int x)
{
int i,cur,to,w;
queue<int> q;
static bool inq[];
static int cnt[];
tot = ;
memset(head,,sizeof(head));
memset(inq,false,sizeof(inq));
memset(cnt,,sizeof(cnt));
memset(dis,,sizeof(dis));
add(,,x);
for (i = ; i <= ; i++) add(i,i-,-v[i]);
for (i = ; i <= ; i++) add(i-,i,);
for (i = ; i <= ; i++) add(i-,i,R[i]);
for (i = ; i <= ; i++) add(i+,i,R[i]-x);
while (!q.empty()) q.pop();
q.push();
dis[] = ;
inq[] = true;
cnt[] = ;
while (!q.empty())
{
cur = q.front();
q.pop();
inq[cur] = false;
for (i = head[cur]; i; i = e[i].nxt)
{
to = e[i].to;
w = e[i].w;
if (dis[cur] + w > dis[to])
{
dis[to] = dis[cur] + w;
if (!inq[to])
{
inq[to] = true;
q.push(to);
cnt[to]++;
if (cnt[to] > ) return false;
}
}
}
}
return dis[] == x;
} int main()
{ scanf("%d",&T);
while (T--)
{
memset(v,,sizeof(v));
for (i = ; i <= ; i++) scanf("%d",&R[i]);
scanf("%d",&k);
for (i = ; i <= k; i++)
{
scanf("%d",&t);
v[t+]++;
}
l = ; r = k;
ans = -;
while (l <= r)
{
mid = (l + r) >> ;
if (spfa(mid))
{
r = mid - ;
ans = mid;
} else
l = mid + ;
}
if (ans == -) printf("No Solution\n");
else printf("%d\n",ans);
} return ; }
【POJ 1275】 Cashier Employment的更多相关文章
- 【POJ 1275】 Cashier Employment(差分约束系统的建立和求解)
[POJ 1275] Cashier Employment(差分约束系统的建立和求解) Cashier Employment Time Limit: 1000MS Memory Limit: 10 ...
- 【POJ1275】Cashier Employment 差分约束
[POJ1275]Cashier Employment 题意: 超市经历已经提供一天里每一小时需要出纳员的最少数量————R(0),R(1),...,R(23).R(0)表示从午夜到凌晨1:00所需要 ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
- BZOJ2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 126 Solved: 90[Submit][Sta ...
- BZOJ2296: 【POJ Challenge】随机种子
2296: [POJ Challenge]随机种子 Time Limit: 1 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 114 Solv ...
随机推荐
- CAD创建组(网页版)
主要用到函数说明: _DMxDrawX::CreateGroup 创建组.如果组名已经存在,就把实体加入组中.详细说明如下: 参数 说明 BSTR pszName 组名.,如果为空,创建匿名组 IDi ...
- [USACO] 打井 Watering Hole
题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pastures which are conven ...
- C++关键字:explicit
#include "pch.h" #include <iostream> using namespace std; class BaseClass { public: ...
- eshing wind/tidal turbine using Turbogrid
Table of Contents 1. meshing wind turbine using Turbogrid 1.1. ref 1 meshing wind turbine using Turb ...
- pandas处理各类表格数据
经常遇到Python读取excel和csv还有其他各种文件的内容.json还有web端的读取还是比较简单,但是excel和csv的读写是很麻烦.这里记录了pandas库提供的方法来实现文本内容和Dat ...
- POJ 1226 Substrings
Substrings Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: ...
- 清北学堂模拟赛d1t2 火柴棒 (stick)
题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...
- poj 2420 模拟退火法基础
/* 题意:给n个电脑,求一个点到这n个电脑的距离和最小. 模拟退火法:和poj1379的方法类似 因为坐标范围是0-10000 不妨把它看成是10000*10000的正方形来做 */ #includ ...
- Linux下汇编语言学习笔记77 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- mongodb片健的选取及更改
1.总的原则:选键的时候多考虑以下问题. 写操作是怎么样的,有多大? 系统每小时会写多少数据,每天呢,高峰期呢 那些字段是随机的,那些是增长的 读操作是怎么样的,用户在访问那些数据 数据索引做了吗?应 ...