社区讨论

TLE on #30 ,谁能帮我卡掉最后3ms?

P1120[CERC 1995] 小木棍参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mia09m18
此快照首次捕获于
2025/11/22 16:06
3 个月前
此快照最后确认于
2025/11/22 16:57
3 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

const int N = 100;
int t[N], n, maxi, mini, sum;

void dfs(int rst, int s, int ans, int p){
	if(rst == 0){
		printf("%d", ans);
		exit(0);
	}
	if(s == ans){
		dfs(rst - 1, 0, ans, maxi);
		return;
	}
	for(int i = p; i >= mini; i --){
		if(!t[i]) continue;
		if(i + s > ans) continue;
		t[i] --;
		dfs(rst, s + i, ans, i);
		t[i] ++;
		if(s == 0 || s + i == ans) break; 
	}
	return;
}

int main(){
	scanf("%d", &n);
	mini = N;
	int x = 0;
	while(n --){
		scanf("%d", &x);
		t[x] ++;
		maxi = max(maxi, x);
		mini = min(mini, x);
		sum += x;
	}
	for(int i0 = maxi; i0 <= sum / 2; i0 ++){
		if(sum % i0 == 0) dfs(sum / i0, 0, i0, maxi);
	}
    printf("%d", sum);
}

回复

3 条回复,欢迎继续交流。

正在加载回复...