记录编号 |
176308 |
评测结果 |
AAAAAAAAAAAA |
题目名称 |
栅栏的木料 |
最终得分 |
100 |
用户昵称 |
0 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.391 s |
提交时间 |
2015-08-08 15:55:18 |
内存使用 |
0.32 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <stack>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 55;
const int maxr = 1030;
int n,r,A[maxr],data[maxn],Pre[maxr];
int Limit,flag,TOT,Sum;
void init();
void work();
void iddfs(int dep,int prev);
int main() {
freopen("fence8.in","r",stdin);
freopen("fence8.out","w",stdout);
init();
work();
return 0;
}
void init() {
int i;
scanf("%d",&n);
for (i = 1; i <= n; i++) {
scanf("%d",&data[i]);
TOT += data[i];
}
sort(data + 1,data + 1 + n);
scanf("%d",&r);
for (i = 1; i <= r; i++) scanf("%d",&A[i]);
sort(A + 1,A + 1 + r);
for (i = 1; i <= r; i++) if (A[i] > data[n]) break;
r = i-1;
Pre[0] = 0;
for (i = 1; i <= r; i++) Pre[i] = Pre[i - 1] + A[i];
}
void iddfs(int dep,int prev) {
int st = 1,i;
if (Sum > TOT - Pre[Limit]) return;
if (dep > Limit) flag = 1;//超过深度
if (flag) return;
if (A[Limit - dep + 1] == A[Limit - dep + 2]) st = prev;
for (i = st; i <= n; i++)
if (A[Limit - dep + 1] <= data[i]) {
data[i] -= A[Limit - dep + 1];
if (data[i] < A[1]) Sum += data[i];
iddfs(dep + 1,i);
if (data[i] < A[1]) Sum -= data[i];
data[i] += A[Limit - dep + 1];
}
}
void work() {
for (Limit = 1; Limit <= r; Limit++) {
flag = false;
iddfs(1,1);
if (!flag) break;
}
printf("%d",Limit - 1);
}