社区讨论
对拍上万数据无误,却只有50求助QAQ
P3878[TJOI2010] 分金币参与者 6已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mi86c943
- 此快照首次捕获于
- 2025/11/21 09:21 4 个月前
- 此快照最后确认于
- 2025/11/21 09:21 4 个月前
RT
CPP#include<bits/stdc++.h>
#include<vector>
#include<set>
#define rep(a,b,c) for(register int a=b ; a<=c ; ++a)
#define dwn(a,b,c) for(register int a=b ; a>=c ; --a)
using namespace std;
inline int read() {
int res=0,f=1;char ch;
while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
do {
res=res*10+ch-'0';
} while(isdigit(ch=getchar()));
return res*f;
}
int num[1<<20],val[40];
inline int get_state(int st,int id) {
int ans=0;
rep(i,0,14) ans+=((1<<i)&st)?val[i+id]:0;
return ans;
}
struct node {
int cnt,val;
bool operator < (node a) const {
return cnt==a.cnt?val<a.val:cnt<a.cnt;
}
}bz[1<<20];
int lft[20],ret[1<<20];
int main() {
rep(i,0,1<<15-1) num[i]=num[i>>1]+(i&1);
int t=read();
while(t--) {
int n=read(),ans=0x7fffffff,sum=0;
int S=n>>1,T=n-S;
rep(i,0,n-1) val[i]=read(),sum+=val[i];
rep(i,0,(1<<S)-1) bz[i]={num[i],get_state(i,0)};
sort(bz,bz+(1<<S));
rep(i,0,(1<<S)-1) ret[i]=bz[i].val;
lft[0]=0,lft[S+1]=1<<S;
rep(i,1,(1<<S)-1) if(bz[i].cnt!=bz[i-1].cnt) lft[bz[i].cnt]=i;
rep(i,0,(1<<T)-1) {
int c=S-num[i],v=get_state(i,S),pos;
if(c!=-1) {
pos=lower_bound(ret+lft[c],ret+lft[c+1],sum/2-v)-ret;
if(pos<lft[c+1]) ans=min(ans,abs(2*(ret[pos]+v)-sum));
if(pos>lft[c]) ans=min(ans,abs(2*(ret[pos-1]+v)-sum));
}
}
printf("%d\n",ans);
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...