记录编号 191281 评测结果 AAAAAAAAAA
题目名称 [POJ1275]出纳员的雇佣 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.025 s
提交时间 2015-10-06 20:56:59 内存使用 0.29 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<deque>
  3. #include<cstring>
  4. #include<iomanip>
  5. #include<algorithm>
  6. #include<iostream>
  7. using namespace std;
  8. const int SIZEN=40,maxn=0x7fffffff/2;
  9. int N,R[SIZEN],w[SIZEN],P=24;
  10. deque<pair<int,int> > s[SIZEN];
  11. void read()
  12. {
  13. for(int i=0;i<24;i++)
  14. scanf("%d",&R[i]);
  15. scanf("%d",&N);
  16. memset(w,0,sizeof(w));
  17. for(int i=1;i<=N;i++)
  18. {
  19. int t;
  20. scanf("%d",&t);
  21. w[t]++;
  22. }
  23. }
  24. void gragh(int x)
  25. {
  26. for(int i=0;i<=P;i++) s[i].clear();
  27. for(int i=1;i<P;i++) s[i].push_back(make_pair(i-1,0));
  28. s[0].push_back(make_pair(P,0));
  29. for(int i=1;i<P;i++) s[i-1].push_back(make_pair(i,w[i]));
  30. s[P].push_back(make_pair(0,w[0]));
  31. for(int i=8;i<P;i++) s[i].push_back(make_pair(i-8,-R[i]));
  32. for(int i=0;i<=7;i++) s[i].push_back(make_pair(i+16,x-R[i]));
  33. s[23].push_back(make_pair(P,-x));
  34. s[P].push_back(make_pair(23,x));
  35. }
  36. bool spfa(int x)
  37. {
  38. int sw[SIZEN],cnt[SIZEN]={0};
  39. bool inq[SIZEN];
  40. deque<int> Q;
  41. for(int i=0;i<=P;i++) sw[i]=maxn,inq[i]=0;
  42. sw[P]=0;inq[P]=1;Q.push_back(P);cnt[P]++;
  43. while(!Q.empty())
  44. {
  45. int x=Q.front();Q.pop_front();inq[x]=0;
  46. for(int i=0;i<s[x].size();i++)
  47. {
  48. int v=s[x][i].first,w=s[x][i].second;
  49. if(sw[v]>sw[x]+w)
  50. {
  51. if(!inq[v])
  52. {
  53. if(cnt[v]>=P) return 0;
  54. inq[v]=1;cnt[v]++;
  55. Q.push_back(v);
  56. }
  57. sw[v]=sw[x]+w;
  58. }
  59. }
  60. }
  61. if(sw[23]!=x) return 0;
  62. return 1;
  63. }
  64. int work()
  65. {
  66. int l=0,r=N+1;
  67. while(l<r)
  68. {
  69. int mid=(l+r)/2;
  70. gragh(mid);
  71. if(spfa(mid)) r=mid;
  72. else l=mid+1;
  73. }
  74. return l;
  75. }
  76. int main()
  77. {
  78. freopen("cashieremployment.in","r",stdin);
  79. freopen("cashieremployment.out","w",stdout);
  80. int T;
  81. scanf("%d",&T);
  82. while(T)
  83. {
  84. T--;
  85. read();
  86. int ans=work();
  87. if(ans==N+1) printf("No Solution\n");
  88. else printf("%d\n",ans);
  89. }
  90. return 0;
  91. }