27分TLE求剪枝
查看原帖
27分TLE求剪枝
785636
2022_37_yzyUUU楼主2024/9/26 18:44

悬关

#include<bits/stdc++.h>
using namespace std;
int n,a[70],sum,s[70],f,sk;
inline int read() {
    register int x = 0,f = 1;register char ch;
    ch = getchar();
    while(ch > '9' || ch < '0'){if(ch == '-') f = -f;ch = getchar();}
    while(ch <= '9' && ch >= '0'){x = x * 10 + ch - 48;ch = getchar();}
    return x * f;
}
inline bool pd(int t,int k){
	if(t>n){
		for(int i=1;i<k;i++)if(s[i]!=s[i+1])return 0;
		return 1;
	}
	int ans=0;
	for(int i=1;i<=k;i++){	
		if(s[i]+a[t]<=sk){
			s[i]+=a[t];
			bool p=pd(t+1,k);
			ans=ans||p;
			f=ans;
			s[i]-=a[t];
		}
	}
	return ans;
}
bool cmp(int a,int b){
	return a>b;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		sum+=a[i]=read();
	}
	sort(a+1,a+n+1,cmp);
	int l=1,r=n;
	while(l<r){
		f=0;
		memset(s,0,sizeof(s));
		int mid=l+r+1>>1;
		sk=sum/mid;
		if(sum%mid==0&&pd(1,mid)){
			l=mid;
		}else{
			r=mid-1;
		}
	}
	cout<<sum/l;
}
2024/9/26 18:44
加载中...