蒟蒻76pts求助
  • 板块P1120 小木棍
  • 楼主_yjh
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/5/15 20:55
  • 上次更新2023/11/4 23:13:08
查看原帖
蒟蒻76pts求助
222104
_yjh楼主2021/5/15 20:55
#include<iostream>
#include<cstring> 
#include<algorithm>
using namespace std;
bool visit[70000]; //标记是否用过
long long n,m,len,solve,ans=2147483647,a[70000]; //n:总数;m:切割前根数;len:切割前长度;solve:是否有解;ans:答案
long long down=-1,up; //下限,上限
bool cmp(int a,int b) {
	return a>b;
}
void dfs(int k,int last,int rest) {
	int t;
	if(k==m) {
		solve=true;
		return ;
	}
	if(rest==0) {
		for(int i=1;i<=n;i++) {
			if(!visit[i]) {
				visit[i]=1;
				t=i;
				break;
			}
		}
		dfs(k+1,t,len-a[t]);
	}
	for(int i=last+1;i<=n;i++) {
		if(!visit[i]&&rest>=a[i]) {
			visit[i]=true;
			dfs(k,i,rest-a[i]);
			visit[i]=false;
		} 
		//if(i==n) return ;
	}
}
int main() {
	ios::sync_with_stdio(false);
    cin>>n;
	int o=n;
	memset(a,0,sizeof(a));
	down=-1,up=0;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
		if(a[i]>50) o--,a[i]=0;
		if(a[i]<=50) up+=a[i];
		if(a[i]<=50) down=max(down,a[i]);
	}
	sort(a+1,a+n+1,cmp);
	n=o;
	//for(int i=1;i<=n;i++) cout<<a[i]<<' ';
	//cout<<'\n';
	//cout<<n<<' '<<up<<'\n';
    for(int i=down;i<=up;i++) {
		if(up%i==0) {
			memset(visit,0,sizeof(visit));
			len=i;
			solve=0;
			visit[1]=1;
			m=up/i;
			dfs(1,1,len-a[1]);
			if(solve) ans=min(len,ans);
			//cout<<solve<<' '<<len<<'\n';
		}
	}
    cout<<ans<<'\n';
    ans=2147483647;
	return 0;
}

改了1h,从21pts→76pts,实在改不了了,有没有大佬能帮忙查一下错,谢谢。

2021/5/15 20:55
加载中...