记录编号 176308 评测结果 AAAAAAAAAAAA
题目名称 栅栏的木料 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 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);
}