hdoj1529

Problem : 1529 ( Cashier Employment )     Judge Status : Accepted
RunId : 2664468    Language : G++    Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Thu 22 Jul 2010 06:10:59 PM CST
*File Name: main.cpp
*Description:差分约束系统
\***************************************************************/

//*========================*Head File*========================*\\

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
struct
E{
int
s,e,len;
//起点,终点,长度
}edges[100];
int
R[
26],num[26],ans,T,N,cnt,dist[26],t;
//*=======================*Main Program*=======================*//
using namespace std;

bool
bellman_ford(){
int
_cnt=cnt;
int
s,e,len;
edges[_cnt].s=
0;
edges[_cnt].e=
24;
edges[_cnt].len=ans;
_cnt++;
for
(int i=
1;i<=8;i++){//S[i]-S[i+16]>=R[i] (1<=i<=8)
edges[_cnt].s=i+16;
edges[_cnt].e=i;
edges[_cnt].len=R[i]-ans;
_cnt++;
}

memset(dist,
0,sizeof(dist));
dist[
24]=ans;
for
(int i=
0;i<72;i++){//这儿我不知道为什么24不行,有大牛知道的话麻烦告诉一下
bool
flag=
true;
for
(int j=
0;j<_cnt;j++){
s=edges[j].s,e=edges[j].e,len=edges[j].len;
if
(dist[e]<dist[s]+len){
//求最长路径
flag=false;
dist[e]=dist[s]+len;
}
}

if
(flag)break;
}

return
ans==dist[
24];
}

int
main(){

//freopen("input","r",stdin);
scanf("%d",&T);
while
(T--){
memset(num,
0,sizeof(num));
for
(int i=
1;i<=24;i++)//时间全加1
scanf("%d",R+i);
scanf(
"%d",&N);
for
(int i=
0;i<N;i++){
scanf(
"%d",&t);
num[t+
1]++;
}

cnt=
0;//标记边数
for(int i=1;i<=24;i++){//S[i]-S[i-1]>=0 (1<=i<=24)
edges[cnt].s=i-1;
edges[cnt].e=i;
edges[cnt].len=
0;
cnt++;
}

for
(int i=
1;i<=24;i++){//S[i]-S[i-1]<=num[i] (1<=i<=24)
edges[cnt].s=i;
edges[cnt].e=i-
1;
edges[cnt].len=-num[i];
cnt++;
}

for
(int i=
1;i<24;i++){//S[i]-S[0]>=0 (1<=i<=23,24在bellman_ford()函数里)
edges[cnt].s=0;
edges[cnt].e=i;
edges[cnt].len=
0;
cnt++;
}

for
(int i=
9;i<=24;i++){//S[i]-S[i-8]>=R[i] (9<=i<=24,
//1~8涉及到S[24],在bellman_ford()函数里)
edges[cnt].s=i-8;
edges[cnt].e=i;
edges[cnt].len=R[i];
cnt++;
}

ans=N;
if
(!bellman_ford())
printf(
"No Solution\n");
else
{
int
s=
0,t=N;
ans=(t+s)/
2;
while
(s<t){
//二分
if(bellman_ford()){
t=ans;
ans=(s+t)/
2;
}

else
{
s=ans+
1;
ans=(s+t)/
2;
}
}

printf(
"%d\n",ans);
}
}
}

转载于:https://www.cnblogs.com/Open_Source/archive/2010/07/23/1904917.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值