87分求调
  • 板块P1120 小木棍
  • 楼主guozhetao
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/7/28 12:50
  • 上次更新2025/7/28 15:55:03
查看原帖
87分求调
669924
guozhetao楼主2025/7/28 12:50

rt,最后一个点超时了15ms,求优化

87分记录

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[70],tot = 0;
bool cmp(int x,int y) {
	return x > y;
} 
bool vis[70];
void dfs(int rest,int num,int aim,int small) {
	if(num == 0) {
		printf("%lld\n",aim);
		exit(0);
	}
	if(rest == 0) {
		dfs(aim,num - 1,aim,tot / aim - num + 1);
	}
	if(rest < a[n]) return;
	for(int i = small;i <= n;i++) {
		if(vis[i] or rest < a[i]) continue;
		if(a[i] == a[i - 1] and !vis[i - 1]) continue;
		vis[i] = 1;
		dfs(rest - a[i],num,aim,i + 1);
		vis[i] = 0;
		if(rest == aim) return;
		if(rest == a[i]) return;
	}
	return;
}
signed main() {
	scanf("%lld",&n);
	for(int i = 1;i <= n;i++) {
		scanf("%lld",&a[i]);
		tot += a[i];
	}
	sort(a + 1,a + n + 1,cmp);
	for(int i = a[1];i <= tot;i++) {
		if(tot % i == 0) {
			dfs(i,tot / i,i,1);
		}
	}
    return 0;
}
2025/7/28 12:50
加载中...