记录编号 196939 评测结果 AAAAAAAAAAAA
题目名称 栅栏的木料 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.020 s
提交时间 2015-10-22 21:40:09 内存使用 0.33 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. using namespace std;
  5. const int SIZEN=60,SIZER=1040;
  6. int N,R,board[SIZEN],rail[SIZER],sb=0,sr=0;
  7. int pos[SIZER]={0},pre[SIZER]={0};
  8. void read()
  9. {
  10. scanf("%d",&N);
  11. for(int i=1;i<=N;i++)
  12. {
  13. scanf("%d",&board[i]);
  14. sb+=board[i];
  15. }
  16. scanf("%d",&R);
  17. for(int i=1;i<=R;i++)scanf("%d",&rail[i]);
  18. }
  19. bool dfs(int now,int sum)
  20. {
  21. if(now<1) return 1;
  22. if(sum>sb-sr) return 0;
  23. bool ok=0;
  24. int st=1;
  25. if(rail[now]==rail[now+1]) st=pos[now+1];
  26. for(int i=st;i<=N;i++)
  27. {
  28. if(board[i]>=rail[now])
  29. {
  30. board[i]-=rail[now];
  31. int tem=sum;
  32. pos[now]=i;
  33. if(board[i]<rail[1]) tem=sum+board[i];
  34. if(dfs(now-1,tem)) ok=1;
  35. board[i]+=rail[now];
  36. pos[now]=0;
  37. if(ok==1) return 1;
  38. }
  39. }
  40. return 0;
  41. }
  42. bool check(int x)
  43. {
  44. sr=pre[x];
  45. if(dfs(x,0)) return 1;
  46. else return 0;
  47. }
  48. bool cmp(int a,int b)
  49. {
  50. return a>b;
  51. }
  52. void work()
  53. {
  54. int l=0,r=R;
  55. sort(rail+1,rail+R+1);
  56. sort(board+1,board+1+N);
  57. for(int i=1;i<=R;i++) pre[i]=pre[i-1]+rail[i];
  58. while(l<r)
  59. {
  60. int mid=(l+r)/2;
  61. if(check(mid)) l=mid+1;
  62. else r=mid;
  63. //cout<<mid<<endl;
  64. }
  65. if(!check(r)) r--;
  66. printf("%d",r);
  67. }
  68. int main()
  69. {
  70. freopen("fence8.in","r",stdin);
  71. freopen("fence8.out","w",stdout);
  72. read();
  73. work();
  74. return 0;
  75. }