求调
查看原帖
求调
1111742
mincrafter_or_cy楼主2024/7/25 17:04

17.18点WA,其他点AC

#include <bits/stdc++.h>
using namespace std;
#define maxn 70
int n,need,sum,Size;
int a[maxn],nxt[maxn];
bool used[maxn];
bool found;
void dfs(int now,int lastuse,int w){
  /*now->第几根,lastuse->上一个,w->剩余(想不到更好的名字了)*/
    int x;
    if(w==0){
     	if(now==need){found=1;return;}
        for(x=1;x<=n;x++)
            if(!used[x]) break;
        used[x]=1;
       	dfs(now+1,x,Size-a[x]);
       	used[x]=0;
       	if(found) return;
    }
    int l=lastuse+1,r=n,mid;
   	while(l<r){
        mid=(l+r)>>1;
       	if(a[mid]<=w) r=mid;
       	else l=mid+1;
   	}
   	for(x=l;x<=n;x++){
       	if(!used[x]){
           	used[x]=1;
           	dfs(now,x,w-a[x]);
            used[x]=0;
            if(found) return;
            if(w==a[x]||w==Size) return;
            x=nxt[x];
            if(x==n) return;
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
        //printf("%d ",a[i]);无误
    }
    sort(a+1,a+n+1,greater_equal<int>());
    nxt[n]=n;
    for(int i=n-1;i>0;i--){
        if(a[i]==a[i+1]) nxt[i]=nxt[i+1];
        else nxt[i]=i;
        //printf("%d ",nxt[i]);无误
    }
    //printf("%d ",sum);无误
	used[1]=1;
    for(Size=a[1];Size<=(sum>>1);Size++){
        if(Size==0||sum%Size!=0) continue;
        need=sum/Size;
        //printf("%d %d ",Size,need);无误
        found=0;
        dfs(1,1,Size-a[1]);
        if(found){printf("%d\n",Size);return 0;}
    }
    printf("%d\n",sum); return 0;
}
2024/7/25 17:04
加载中...