记录编号 191281 评测结果 AAAAAAAAAA
题目名称 [POJ1275]出纳员的雇佣 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.025 s
提交时间 2015-10-06 20:56:59 内存使用 0.29 MiB
显示代码纯文本
#include<cstdio>
#include<deque>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<iostream>
using namespace std;
const int SIZEN=40,maxn=0x7fffffff/2;
int N,R[SIZEN],w[SIZEN],P=24;
deque<pair<int,int> > s[SIZEN];
void read()
{
	for(int i=0;i<24;i++)
		scanf("%d",&R[i]);
	scanf("%d",&N);
	memset(w,0,sizeof(w));
	for(int i=1;i<=N;i++)
	{
		int t;
		scanf("%d",&t);
		w[t]++;
	}
}
void gragh(int x)
{
	for(int i=0;i<=P;i++) s[i].clear();
	for(int i=1;i<P;i++) s[i].push_back(make_pair(i-1,0));
	s[0].push_back(make_pair(P,0));
	for(int i=1;i<P;i++) s[i-1].push_back(make_pair(i,w[i]));
	s[P].push_back(make_pair(0,w[0]));
	for(int i=8;i<P;i++) s[i].push_back(make_pair(i-8,-R[i]));
	for(int i=0;i<=7;i++) s[i].push_back(make_pair(i+16,x-R[i]));
	s[23].push_back(make_pair(P,-x));
	s[P].push_back(make_pair(23,x));
}
bool spfa(int x)
{
	int sw[SIZEN],cnt[SIZEN]={0};
	bool inq[SIZEN];
	deque<int> Q;
	for(int i=0;i<=P;i++) sw[i]=maxn,inq[i]=0;
	sw[P]=0;inq[P]=1;Q.push_back(P);cnt[P]++;
	while(!Q.empty())
	{
		int x=Q.front();Q.pop_front();inq[x]=0;
		for(int i=0;i<s[x].size();i++)
		{
			int v=s[x][i].first,w=s[x][i].second;
			if(sw[v]>sw[x]+w)
			{
				if(!inq[v])
				{
					if(cnt[v]>=P) return 0;
					inq[v]=1;cnt[v]++;
					Q.push_back(v);
				}
				sw[v]=sw[x]+w;
			}
		}
	}
	if(sw[23]!=x) return 0;
	return 1;
}
int work()
{
	int l=0,r=N+1;
	while(l<r)
	{
		int mid=(l+r)/2;
		gragh(mid);
		if(spfa(mid)) r=mid;
		else l=mid+1;
	}
	return l;
}
int main()
{
	freopen("cashieremployment.in","r",stdin);
	freopen("cashieremployment.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T)
	{
		T--;
		read();
		int ans=work();
		if(ans==N+1) printf("No Solution\n");
		else printf("%d\n",ans);
	}
	return 0;
}