链接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即可:

 #include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define eps 1e-15
#define MAXN 25
#define INF 1000000007
#define MAX(a,b) (a > b ? a : b)
#define MIN(a,b) (a < b ? a : b)
#define mem(a) memset(a,0,sizeof(a)) struct EDGE
{
int v;
int w;
int next;
}edge[*MAXN];
int head[MAXN], d[MAXN],tot,T,N,R[MAXN],t[MAXN],ans,x; bool Bellman_Ford(int s)
{
for(int i=;i<=;i++) d[i] == (i==s)?:INF;
for(int k=;k<=;k++)
{
for(int i=;i<=;i++)
{
for(int e = head[i];d[i]!=INF && e!=-;e=edge[e].next)
{
if(d[edge[e].v]>d[i]+edge[e].w)
{
d[edge[e].v] = d[i] + edge[e].w;
}
}
}
}
for(int i=;i<=;i++)
{
for(int e = head[i];d[i]!=INF && e!=-;e=edge[e].next)
{
if(d[edge[e].v]>d[i]+edge[e].w)return false;
}
}
return true;
} void AddEdge(int u,int v,int w)
{
edge[tot].v = v;
edge[tot].w = w;
edge[tot].next = head[u];
head[u] = tot++;
} void BuildGragh(int NumOfPer)//由于每次总人数都不一样,所以需要重新建图
{
tot = ; mem(edge); memset(head,-,sizeof(head));
for(int i=;i<=;i++){AddEdge(i-,i,t[i]); AddEdge(i,i-,);}
for(int i=;i<=;i++) AddEdge(i,i-,-R[i]);
for(int i=;i<=;i++) AddEdge(i,i+,NumOfPer-R[i]);
AddEdge(,,-NumOfPer);
} void BSearch(int low,int high)//对总人数二分
{
if(low > high)return ;
int mid = (low + high) / ;
BuildGragh(mid);
if(Bellman_Ford())//表示可以找到一种解决方案
{
ans = mid;
BSearch(low, mid-);
}
else
{
BSearch(mid+,high);
}
} int main()
{
while(~scanf("%d", &T))while(T--)
{ mem(R); mem(t);
for(int i=;i<=;i++)
{
scanf("%d", &R[i]);
}
scanf("%d", &N);
for(int i=;i<N;i++){ scanf("%d", &x); t[x+]++;}
ans = -;
BSearch(,N);
if(ans == -) printf("No Solution\n");
else printf("%d\n",ans);
}
return ;
}

POJ1275Cashier Employment(查分约束系统)的更多相关文章

  1. POJ2983 查分约束系统

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

  2. bzoj 2330 SCOI2011糖果 查分约束系统

    就根据题目中给的约束条件建图就行了 需要注意的是,我们要做的是最长路,因为需要约束每个点都是大于0 那么可以建一个超级源指向所有点,超级源的dis是1,边长为0 那么这样做最长路就可以了 好了我们这么 ...

  3. 洛谷P1993 小 K 的农场(查分约束)

    /* 加深一下对查分约束的理解 建图的时候为了保证所有点联通 虚拟一个点 它与所有点相连 权值为0 然后跑SPFA判负环 这题好像要写dfs的SPFA 要不超时 比较懒 改了改重复进队的条件~ */ ...

  4. 1247 排排站 USACO(查分+hash)

    /* 暴力查分 n*n */ #include<cstdio> #include<cstring> #include<iostream> #define maxn ...

  5. codevs 1242 布局(查分约束+SPFA)

    /* 查分约束. 给出的约束既有>= 又有<= 这时统一化成一种 Sb-Sa>=x 建边 a到b 权值为x Sb-Sa<=y => Sa-Sb>=-y 建边 b到a ...

  6. poj 1201 Interval (查分约束)

    /* 数组开大保平安. 查分约束: 输入的时候维护st和end 设每个点取元素di个 维护元素个数前缀和s Sbi-Sai-1>=ci 即:建立一条从ai-1到bi的边 权值为ci 表示ai到b ...

  7. 【POJ 1275】 Cashier Employment(差分约束系统的建立和求解)

    [POJ 1275] Cashier Employment(差分约束系统的建立和求解) Cashier Employment Time Limit: 1000MS   Memory Limit: 10 ...

  8. 智学网电脑端查分小工具 已更新V2.2

    特别鸣谢这段代码的源作者,我的大佬同学\(MetalkgLZH\).由于我没有做什么工作,这篇随笔基本不含相关技术细节. 再次强调,这个程序的主要部分由\(MetalkgLZH\)完成.技术细节与源码 ...

  9. BZOJ 4289: PA2012 Tax Dijkstra + 查分

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

随机推荐

  1. 如何快速delete数据

    苦于qa账号,木有drop,truncate权限,同步数据要挨个delete表里边的数据,就写了个脚本,循环删除某个目标库的所有表里边的数据. 先在information_schema的库里边,通过T ...

  2. hibernate的oracle配置(转)

    连接Oracle数据库的Hibernate配置文件连接Oracle的Hibernate配置文件有两种格式,一种是xml格式的,另一种是Java属性文件格式的.下面分别给出这两种格式配置文件的代码. 1 ...

  3. /etc/selinux/config

    /etc/selinux/configSELINUX=disabled改成了SELINUX=enforcing机器无法启动 linux无法启动怎么解决:[1]selinux配置错误 SELinux 入 ...

  4. ecshop显示所有分类树栏目

    1.找到 category.php 和goods.php 两个文件修改: $smarty->assign('categories', get_categories_tree(0)); // 分类 ...

  5. Shell教程4-Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: 复制纯文本新窗口   #!/bin/bash a=10 echo -e & ...

  6. SQL Server数据类型与SDE库表sde_type对照表

    SDE_column_registry 表管理所有注册列. 警告:如果使用 SQL 界面更改列定义,SDE_column_registry 表中的记录将不会更新.这可能导致之后的任何数据导出失败. S ...

  7. Android彩蛋效果,微信彩蛋效果

    根据Android源码修改,具有微信彩蛋效果 主要代码 public static class Board extends FrameLayout { public static final bool ...

  8. eclipse插件explorer安装使用

    我们知道myeclipse有个open in explorer的按钮.可以方便我们打开任意IDC下的文件或则插件目录 但是eclipse下确没有.因此需要下载下载个eclipse explorer插件 ...

  9. YII 配置文件

    用YIIFramework的库开发 .... Yii::createWebApplication($config); //没有run Yii::import(class1,true),在将class1 ...

  10. 12、NFC技术:读写NFC标签中的Uri数据

    功能实现,如下代码所示: 读写NFC标签的Uri 主Activity import cn.read.write.uri.library.UriRecord; import android.app.Ac ...