社区讨论

蒟蒻87分求助

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

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@lo8hqkgf
此快照首次捕获于
2023/10/27 18:49
2 年前
此快照最后确认于
2023/10/27 18:49
2 年前
查看原帖
呜呜很久之前写的了,当时是满分,数据加强后过不去了呜呜呜。 求大佬相助
CPP
#include<bits/stdc++.h>
using namespace std;
int a[100],v[100],n,len,cnt; 
int ok=0;
void read(int &n){
    char ch = getchar();
    n = 0;
    while (ch < '0' || ch > '9')
        ch = getchar();
    while (ch >= '0' && ch <= '9'){
        n = (n << 3) + (n << 1) + ch - '0';
        ch = getchar();
    }
}
void dfs(int cur,int cab,int last){
	if(cur==cnt+1){
		ok=1;
		return;
	}
	if(cab==len) 
		dfs(cur+1,0,0);
	int fail=0;
	for(int i=last+1;i<=n;i++){
		if(v[i]==0 && cab+a[i]<=len && fail!=a[i])
		{
			v[i]=1;//表示第i根小木棍被使用过
			dfs(cur,cab+a[i],i); 
			if(ok==1) return;//当找到符合的情况后,直接返回 
			fail=a[i];
			v[i]=0;
			if(cab==0 || cab+a[i]==len) return; 
		}
	}
} 

bool cmp(const int &a,const int &b){
	return a>b;
}

int main(){
	int N;
	read(N);
	int sum=0,maxl=0;
	n=len=cnt=ok=0;
	memset(a,0,sizeof(a));
	memset(v,0,sizeof(v));
	for(int i=1;i<=N;i++){
		int temp;
		read(temp);
		if(temp<=50)
		{
			a[++n]=temp;
			sum+=a[n];
			maxl=max(a[n],maxl);
		}
	}
	sort(a+1,a+1+n,cmp);
	for(len=maxl;len<=sum;len++)
		{
			if(sum%len==0)
			{
				cnt=sum/len;
				dfs(1,0,0);
				if(ok==1) break;
			}
		}
		cout<<len<<endl;
		return 0;
}

回复

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

正在加载回复...