POJ 1275 Cashier Employment
POJ_1275
对差分约束系统还是有点摸不着头脑的感觉,看了别人的分析之后才把代码写了出来。
首先这个题目可以做两个预处理,一个是在输入数据时找出R[i]的最大值,最后的结果一定是大于等于R[i]的,这样在枚举结果时就可以减少一部分工作量。另一个是在输入结束后,可以枚举8个小时的区间,如果这个区间里所有可雇用的人数加起来,还不足区间尾那个时间所需要的工人数,那么这种情况一定是无解的,反之,便一定是有解的。
如果设S[i]为[0,i)这些时间内雇佣的总人数,那么可以列出下面几个差分约束方程:
①S[i+1]-S[i]>=0;
②S[i]-S[i+1]>=-t[i];
③0<=j<=24,i=(j+8)mod24,如果结果i为0,赋i值为24。
当i>j时,S[i]-S[j]>=R[i-1];
当i<j时,S[i]-S[j]>=R[i-1]-sum;
④S[24]-S[0]>=sum。
之后,我们可以枚举sum的值,然后依据上面的四个条件建图,最后判断S[24]的值是否等于sum即可。在用SPFA的时候,还要注意对可能存在负圈的情况作出判断。
#include<stdio.h>#include<string.h>int R[30],d[30],t[30],first[30],next[120],v[120],w[120];int q[900],inq[30],inedq[30];int main(){int i,j,k,N,T,ok,tsum,sum,Rmax,u,e,front,rear; scanf("%d",&T);while(T--) { memset(t,0,sizeof(t)); Rmax=0;for(i=0;i<24;i++) { scanf("%d",&R[i]);if(R[i]>Rmax) Rmax=R[i]; } scanf("%d",&N);for(i=0;i<N;i++) { scanf("%d",&k); t[k]++; } ok=1;for(i=0;i<24;i++) { tsum=0;for(j=i,k=0;k<8;j--,k++) {if(j<0) j+=24; tsum+=t[j]; }if(tsum<R[i]) { ok=0;break; } }if(!ok) { printf("No Solution\n");continue; }for(sum=Rmax;sum<=N;sum++) { e=0; memset(first,-1,sizeof(first));for(i=0;i<24;i++) { w[e]=0; v[e]=i; next[e]=first[i+1]; first[i+1]=e; e++; w[e]=t[i]; v[e]=i+1; next[e]=first[i]; first[i]=e; e++; }for(j=0;j<=24;j++) { i=(j+8)%24;if(i==0) i=24;if(i>j) w[e]=-R[i-1];else w[e]=sum-R[i-1]; v[e]=j; next[e]=first[i]; first[i]=e; e++; } w[e]=sum; v[e]=24; next[e]=first[0]; first[0]=e; e++;for(i=0;i<=24;i++) { inq[i]=0; d[i]=10000; inedq[i]=0; } d[0]=0; front=rear=0; q[rear++]=0; ok=1;while(front<rear) { u=q[front++]; inq[u]=0;for(e=first[u];e!=-1;e=next[e])if(d[u]+w[e]<d[v[e]]) { d[v[e]]=d[u]+w[e];if(!inq[v[e]]) { q[rear++]=v[e]; inq[v[e]]=1;if(++inedq[v[e]]>24) { d[24]=-1; front=rear;break; } } } }if(d[24]==sum)break; } printf("%d\n",sum); }return 0; }
转载于:https://www.cnblogs.com/staginner/archive/2011/08/15/2138634.html
POJ 1275 Cashier Employment相关推荐
- 【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 ...
- 【差分约束】 HDOJ 1529 Cashier Employment
引用一下POJ的discuss里的大牛的解释. 详细解释一下. 为避免负数,时间计数1-24.令: R[i] i时间需要的人数 (1<=i<=24) T[i] i时间应聘的人数 (1< ...
- 提高篇 第三部分 图论 第4章 差分约束系统
差分约束系统_我的ACM,我的梦!!!-CSDN博客_差分约束系统 差分约束系统详解 - hr_whisper - 博客园 最短路径算法:Bellman和差分约束系统_算法导论视频课程_其他视频-51 ...
- I won't tell you this is about graph theory----zjfc bellman-ford算法与spfa算法
题目描述 To think of a beautiful problem description is so hard for me that let's just drop them off. :) ...
- POJ前面的题目算法思路【转】
1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...
- NOIP 好题推荐(DP+搜索+图论)POJ ZOJ
NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS) 1090 Chain ->格雷码和二进制码 ...
- POJ 超详细分类
POJ 各题算法 1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 ...
- POJ 图论分类 + DP(较全 自己又加了点)
DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
最新文章
- Pytorch:transforms的二十二个方法
- 解决ubuntu里面的sudo: /etc/sudoers is mode 0640, should be 0440
- 龙邱树莓派Raspberry Pi 扩展板电路及其相关实验
- python连sql server学生管理系统_Python 跨平台连接 SQL Server
- iOS Xcode工程目录的 folder 和 group的区别(蓝色和黄色文件夹的区别)
- Fuel 30 分钟快速安装OpenStack
- 《Head First 设计模式》专题上线
- apicloud代码压缩和全局加密
- redis持久化RDB与AOF
- 切换进程 切换线程
- Python中随机数种子的作用及使用
- WSDM-爱奇艺:用户留存预测挑战赛 线上0.865
- 【旅游热点】金秋十月 “额济纳胡杨林”登内蒙古景区热度榜首
- 用JLINK烧写U-boot到Nand Flash中
- MOSFET反向恢复特性总结-4
- 基于 Matlab/simulink的锂电池建模与仿真——复现论文《基于二阶EKF的锂离子电池SOC估计的建模与仿真》的仿真部分
- 微信硬件蓝牙设备开发之设备解绑(13)
- MVPArms Retrofit RxJava实现注册
- html页面刷新回到顶部_HTML5 回到顶部
- 中国游戏行业市场分析(一)关于国内游戏制作的问题