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
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);
}
}
}