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);
}
}
}
posted @ 2010-07-23 08:11  open source  阅读(178)  评论(0编辑  收藏  举报