记录编号 |
191281 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[POJ1275]出纳员的雇佣 |
最终得分 |
100 |
用户昵称 |
mikumikumi |
是否通过 |
通过 |
代码语言 |
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;
- }