最后一个点TLE,求调
  • 板块P1120 小木棍
  • 楼主Mmatt
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/7/17 10:04
  • 上次更新2023/11/3 09:24:17
查看原帖
最后一个点TLE,求调
753833
Mmatt楼主2023/7/17 10:04
#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int sum=0;
    char ch=getchar();
    while(ch>57||ch<48) ch=getchar();
    while(ch>=48&&ch<=57) sum=sum*10+ch-48,ch=getchar();
    return sum;
}
int n,sum,cnt,res,ans,a[100];
bool vis[100] ;
bool cmp(int a,int b){
	return a>b;
}
bool dfs(int len,int sta,int now){//(木棍)剩余长度,根数,组数
	if(now==res) return 1;
	if(len==0)
		if(dfs(ans,1,now+1))return 1;
	for(int i=sta;i<=cnt;i++){
		if(!vis[i]&&a[i]<=len){
			vis[i]=1;
			if(dfs(len-a[i],i+1,now))return 1;
			vis[i]=0;
			if(len==ans||len==a[i])break;
			//当前木棍长度等于剩余长度,因为有更小的,所以一定不行 
			while(a[i]==a[i+1])i++;
		} 
	} 
	return 0;
}
int main(){
	n=read();
	for(int i=1;i<=n;i++){
		int x;x=read();
		if(x>50)continue;
		a[++cnt]=x,sum+=x;
	}
	sort(a+1,a+1+cnt,cmp);
	for(int i=a[1];i<=sum;i++){
		if(sum%i)continue;
		res=sum/i;//组数 
		ans=i;
		if(dfs(ans,1,0)){//(木棍)剩余长度,根数,组数
			printf("%d\n",ans);
			return 0;
		}
			
	}
	return 0;
} 
2023/7/17 10:04
加载中...