TLE#24 2829 30求助
查看原帖
TLE#24 2829 30求助
995390
codePanclA楼主2024/3/3 12:46

怎么改都是460ms,整迷糊了

#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int N=70;
int n,m;
int a[N];
int sum=0;
int cnt=0,ans;
bool use[N];
int nxt[N]; 
inline int read()
{
   int x=0,f=1;
   char ch=getchar();
   while(ch<'0'||ch>'9')
   {
       if(ch=='-')
           f=-1;
       ch=getchar();
   }
   while(ch>='0' && ch<='9')
       x=x*10+ch-'0',ch=getchar();
   return x*f;
}
bool cmp(int a,int b){
   return a>b;
}
void dfs(int now,int last,int len){
   int pos;
   if(!len){
   	if(now==m){
   		cout<<ans;
   		exit(0);
   	}
   	for(pos=1;pos<=cnt;pos++){
   		if(!use[pos]) break;
   	}
   		use[pos]=1;
   		dfs(now+1,pos,ans-a[pos]);
   		use[pos]=0;
   	
   }
   	int l=last,r=cnt;
   	while(l+1<r){
   		int mid=(l+r)>>1;
   		if(a[mid]<=len) r=mid;
   		else l=mid;
   	}
   	for(int i=l;i<=cnt;i++){
   		if(use[i]) continue;
   		use[i]=1;
   		dfs(now,i,len-a[i]);
   		use[i]=0;
   		if(ans==a[i]||ans==len) return;
   		i=nxt[i];
   		if(i==cnt) return;
   	}
   }

int main(){
   n=read();
   for(int i=1;i<=n;i++){
   	int t;
   	t=read();
   	if(t>50) continue;
   	a[++cnt]=t;
   	sum+=t;
   }
   sort(a+1,a+1+n,cmp);
   nxt[cnt]=cnt;
   for(int i=n-1;i>0;i--){
   	if(a[i]==a[i+1]) nxt[i]=nxt[i+1];
   	else nxt[i]=i;
   }
   
   for(ans=a[1];ans<=sum/2;ans++){
   	if(sum%ans) continue;
   	m=sum/ans;
   	use[1]=1;  
   	dfs(1,1,ans-a[1]);
   	use[1]=0;
   }
   cout<<sum;
   return 0;	
}
2024/3/3 12:46
加载中...