比赛 2026.9.12 评测结果 AAAAWWWWWW
题目名称 分饼干 最终得分 40
用户昵称 __0w0__ 运行时间 0.826 s
代码语言 C++ 内存使用 3.69 MiB
提交时间 2026-09-12 11:55:57
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,ans,s,r;
int a[51],h[51];
int vis[51];
bool dfs(int now,int num,int goal){
    if(num==goal){
        return 1;
    }
    r=max(r,num);
    bool f=0;
    for(int i=now;i>=1;i--){
        if(vis[i]!=goal&&num+a[i]<=goal&&num+h[i]>=goal){
            vis[i]=goal;
            f|=dfs(i-1,num+a[i],goal);
            if(f)return 1;
            vis[i]=0; 
        }
    }
    return 0;
}
//inline int check(int ask){
//    int xb=upper_bound(a+1,a+n+1,ask)-a-1;
//    int c=dfs(xb,0,ask);
//    if(c){
//        r=0;
//        int b=dfs(xb,0,ask);
//        if(!b)return r;
//        else return 1;
//    }
//    return ask-a[0];
//} 
inline int check(int ask){
    int xb=upper_bound(a+1,a+n+1,ask)-a-1;
    int c=dfs(xb,0,ask);
    if(c){
        r=0;
        int b=dfs(xb,0,ask);
        if(!b)return 0;
        else return 1;
    }
    return 0;
} 
void f(int l,int r){
    if(l>=r)return;
    int mid=l+r>>1;
//    printf("%d:",mid);
    int res=check(mid);
    if(res==1){ 
//        cout<<"accepted on "<<mid<<"\n";
//        for(int i=1;i<=n;i++)cout<<i<<":"<<(vis[i]==res?1:0)<<' ';
        ans=mid;
        f(mid+1,r); 
    }else{
//        cout<<"failed on "<<mid<<"\n";
//        for(int i=1;i<=n;i++)cout<<i<<":"<<(vis[i]==res?1:0)<<' ';
        f(l,res);
//        cout<<'\n';
    }
}
int main(){
    freopen("cookie.in","r",stdin);
    freopen("cookie.out","w",stdout);
//ios::sync_with_stdio(0); 
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i],s+=a[i];
    sort(a+1,a+n+1);
    while(a[n]>s/2)s-=a[n--];
    if(a[n]==s/2)cout<<s/2;
    else{
        if(n<=16){
            for(int i=1;i<=n;i++)h[i]=h[i-1]+a[i];
    //        f(0,s/2);
            for(int i=s/2;i>=1;i--){
                ans=max(ans,check(i)*i);
                if(ans)break;
            }
            cout<<ans;     
        }else{
            f(0,s/2);
            cout<<ans;
        }
    } 
    fclose(stdin);
    fclose(stdout);
    return 0;
}