| 比赛 |
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;
}