12pts求助,按照第一篇题解打的
  • 板块P1120 小木棍
  • 楼主nikodo
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/15 21:04
  • 上次更新2024/1/16 09:53:50
查看原帖
12pts求助,按照第一篇题解打的
598875
nikodo楼主2024/1/15 21:04
#include<bits/stdc++.h>
using namespace std;
int a[70];
int l,r;
bool vis[70];
int n,cnt=0;
int zh[55];
bool solve(int x,int num,int sy,int dq){
	if(sy==0)return solve(x,num+1,x,0);
	if(num==r/x+1){
		return 1;
	}
	vis[dq]=1;//标记用过 
	int l=dq+1,r=n,mid;//从上一个的后面搜 
	while(l<r){//二分求小于剩余长度的木棍 
		mid=(l+r)>>1;
		if(a[mid]<=sy)r=mid;
		else l=mid+1;
	}
	for(int i=l;i<=cnt;i++)
		if(!vis[i])
			if(solve(x,num,sy-a[i],i))
				return 1;
			else if(sy==x||sy==a[i])return 0;//如果当前大木棍还未拼成的部分的长度等于当前木棍的长度或原始长度就退出 
			else i=zh[a[i]];//跳过长度相同的木棍
	vis[dq]=0;//回溯去掉 
	return 0;
}
bool cmp(int a,int b){
	return a>b;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int tmp;
		cin>>tmp;
		if(a[i]>50)continue;//大于50就省去 
		a[++cnt]=tmp;
		r+=tmp;
	}
	sort(a+1,a+cnt+1,cmp);//从大到小枚举 
	for(int i=2;i<=cnt;i++)
		if(a[i]!=a[i-1])
			zh[a[i-1]]=i-1;
	for(int i=a[1];i<=r/2;i++)//原始长度枚举优化 
		if(r%i==0)
			if(solve(i,1,i,0)){//找到答案就退出 
				cout<<i;
				return 0;
			}
}
2024/1/15 21:04
加载中...