Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. /*-----------------
  2. * author: Rainboy
  3. * email: rainboylvx@qq.com
  4. * time: Mon 10 Feb 2020 10:05:32 AM CST
  5. * problem: luogu-1120
  6. *----------------*/
  7. #include <bits/stdc++.h>
  8. #define For(i,start,end) for(i = start ;i <= end; ++i)
  9. #define Rof(i,start,end) for(i = start ;i >= end; --i)
  10. #define Each_e(u) for(i = head[u]; ~i ; i = e[i].next)
  11. using namespace std;
  12.  
  13. /* ======= 全局变量 =======*/
  14. const int maxn = 100;
  15. int n,m;
  16. vector<int> v;
  17. int cnt;
  18. int sum;
  19. int _max = -1;
  20. bool vis[maxn];
  21. int cnt_stick; //木棍的根数
  22. int _next[maxn];
  23.  
  24. void init(){
  25. scanf("%d",&n);
  26. int i,j;
  27. For(i,1,n){
  28. scanf("%d",&j);
  29. if (j <= 50) {
  30. v.push_back(j);
  31. sum += j;
  32. _max = max(_max,j);
  33. }
  34. }
  35. n = v.size();
  36. }
  37. /* ======= 全局变量 END =======*/
  38. int at[maxn];
  39. int stat = 44;
  40. int max_dep = -1;
  41. bool dfs(int dep,int pre,int left){
  42.  
  43. //边界
  44. if(dep == n+1){
  45. if( left == stat) return 1;
  46. return 0;
  47. }
  48. if(n-dep+1 < cnt_stick) return 0;
  49. if( pre == n)
  50. return 0;
  51.  
  52. int i,max_idx,max_val = -1;
  53. if( pre == -1){ //一个新的组合
  54. cnt_stick --;
  55. // 找到最大得值
  56. for( i = 0;i<n;i++)
  57. if( !vis[i]) break;
  58. max_idx = i;
  59. max_val = v[i];
  60. vis[i] = 1;
  61. at[dep] = v[i];
  62.  
  63. int nxt = i;
  64. if( stat -v[i] == 0)
  65. nxt = -1;
  66. if( dfs(dep+1,nxt,stat - v[i]) )
  67. return 1;
  68. cnt_stick++;
  69. vis[i] = 0;
  70. return 0; // 3.
  71. }
  72.  
  73. for( i =pre+1;i<n;i++){
  74. if( vis[i] || v[i] > left) continue;
  75. vis[i] = 1;
  76. at[dep] = v[i];
  77. #ifdef DEBUG
  78. if( left-v[i] == 0 && max_dep < dep)
  79. //if(1)
  80. {
  81. int j;
  82. printf("%4d: ",dep);
  83. For(j,1,dep){
  84. printf("%d ",at[j]);
  85. }
  86. printf("\n");
  87. max_dep = dep;
  88. }
  89. #endif
  90. int next_left = left - v[i];
  91. int nxt = i;
  92. if( !next_left) {
  93. nxt = -1;
  94. next_left = stat;
  95. }
  96. if( dfs(dep+1,nxt,next_left))
  97. return 1;
  98. vis[i] = 0;
  99. if( next_left == stat) return 0;
  100. int j = _next[i];
  101. if( j== -1) return 0;
  102. i = j-1;
  103. }
  104. return 0;
  105. }
  106.  
  107.  
  108. int main(){
  109. clock_t program_start_clock = clock(); //开始记时
  110. //===================
  111. init();
  112. sort(v.begin(), v.end(), greater<int> ());
  113. int i;
  114. _next[v.size()-1] = -1;
  115. for( i = v.size()-1;i>0;i--){
  116. if( v[i-1] == v[i])
  117. _next[i-1] = _next[i];
  118. else
  119. _next[i-1] = i;
  120. }
  121. for(i = _max ; i <= sum /2 ;i++){
  122. if( sum % i != 0 ) continue;
  123. //printf("->%d\n",i);
  124. cnt_stick = sum / i;
  125. //memset(vis,0,sizeof(vis));
  126. stat = i;
  127. int ret = dfs(1,-1,stat);
  128. if( ret ){
  129. printf("%d\n",i);
  130. break;
  131. }
  132. }
  133. if( i > sum/2)
  134. printf("%d\n",sum);
  135. //For(i,1,n){
  136. //printf("%d ",at[i]);
  137. //}
  138. //===================
  139. #ifdef DEBUG
  140. printf("\n Total Time: %lf ms\n",double(clock()-program_start_clock)/(CLOCKS_PER_SEC / 1000));
  141. #endif
  142. return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement