本地测试完美,网站不是3~4ms就是超时,可能死循环了,求助大佬
  • 板块P1120 小木棍
  • 楼主Leon66LL
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/9/27 19:45
  • 上次更新2023/10/27 09:44:53
查看原帖
本地测试完美,网站不是3~4ms就是超时,可能死循环了,求助大佬
803621
Leon66LL楼主2022/9/27 19:45

#include <bits/stdc++.h>
//#include <windows.h>
using namespace std;
bool isCompleted=false;
struct stick{
	int l;
	bool ic;
	stick(){
		l=0;
		ic=0;
	}
};
stick s[66];
int cn=0,tn=0,aim=0;
void out(){
	for(int i=0;i<tn;i++){
		cout<<s[i].l<<' '<<s[i].ic<<" | ";
	}
	cout<<endl;
	cout<<"aim:"<<aim<<endl;
}
void dfs(int completed){
	if(isCompleted)return;
	int left;
	int le;
	bool flag;
	if(completed==aim)completed=0;
	left=aim-completed;
	/*
	//begin
	system("cls");
	out();
	cout<<"chosen:"<<cn<<endl;
	cout<<"completed:"<<completed<<endl;
	cout<<"left:"<<left<<endl;
	Sleep(10);
	//end
	*/
	if(cn==tn&&completed==0&&!isCompleted){
		cout<<aim<<endl;
		isCompleted=true;
		return;
	}
	for(int i=0;s[i].l!=0&&i<tn;i++){
		le=s[i].l;
		while(s[i].ic==1)i++;
		if(s[i].l!=le){
			i--;
			continue;
		}
		if(s[i].ic==1||s[i].l>left)continue;
		le=s[i].l;
		s[i].ic=true;
		cn++;
		dfs(completed+le);
		s[i].ic=false;
		cn--;
		if(isCompleted)return;
		while(s[i+1].l==le)i++;
	}
}
bool cmp(stick a,stick b){
	return a.l>b.l;
}
int main(){
	cin>>tn;
	int total=0;
	for(int i=0;i<tn;i++){
		cin>>s[i].l;
		total+=s[i].l;
	}
	sort(s,s+tn,cmp);
	for(aim=s[0].l;aim<total/2+1;aim++){
		if(total%aim==0){
			dfs(0);
		}
	}
	if(!isCompleted)
	cout<<total<<endl;
	return 0;
}
2022/9/27 19:45
加载中...