状压+二分 70 pts求调 qwq
查看原帖
状压+二分 70 pts求调 qwq
511609
无钩七不改名楼主2023/4/18 22:11

https://www.luogu.com.cn/record/108436781

#include<bits/stdc++.h>
using namespace std;

int n,k;
long long a[20],ans[100005],az;
long long f[1<<16],c[1<<16],res;

int ch(int x,int j){
	int l=x,r=n;
	while(l<r){
		//cout<<l<<" "<<r<<endl;
		int mid=(l+r+1)/2;
		if(ans[mid]-ans[x]<=a[j])l=mid;
		else r=mid-1;
	}
	return l;
}

int main(){
	scanf("%d%d",&k,&n);
	for(int i=1;i<=k;i++)scanf("%lld",&a[i]),az+=a[i];
	sort(a+1,a+1+k);
	for(int i=1;i<=n;i++){
		long long x;
		scanf("%lld",&x);
		ans[i]=ans[i-1]+x;
	}
	res=az+1;
	for(int i=1;i<(1<<k);i++){
		int x=k;
		while((i&(1<<(x-1)))==0&&x)x--;
		c[i]=a[x]+c[i-(1<<(x-1))];
		//cout<<"**"<<x<<" "<<c[i]<<endl;
		for(int j=1;j<=x;j++)
			if(i&(1<<(j-1))){
				f[i]=ch(f[i-(1<<(j-1))],j);
				if(f[i]==n)res=min(res,c[i]);
				//cout<<f[i]<<" "<<c[i]<<" "<<res<<endl;
			}
	}
	printf("%lld",az-res);
	return 0;
} 

蟹蟹泥 qwq

2023/4/18 22:11
加载中...