萌新不会搜索,求教!
查看原帖
萌新不会搜索,求教!
654281
reclusive楼主2023/12/2 15:05

AC代码:pos从大到小。

#include<bits/stdc++.h>
using namespace std;
const int N=51,M=1e3+5;
int m,n,a[N],b[M],c[N],sum[M],s=0,w=0;
bool dfs(int pos,int st,int mid){
	if(!pos)return 1;
	if(s-w<sum[mid])return 0;
	for(int i=st;i<=m;i++){
		if(a[i]>=b[pos]){
			a[i]-=b[pos];
			if(a[i]<b[1])w+=a[i];
			if(b[pos]!=b[pos-1]){
				if(dfs(pos-1,1,mid))return 1;
			}
			else{
				if(dfs(pos-1,i,mid))return 1;
			}
			if(a[i]<b[1])w-=a[i];
			a[i]+=b[pos];
		}
	}
	return 0;
}
int main(){
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d",&c[i]);
		s=s+c[i];
	}
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&b[i]);
	}
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+b[i];
	}
	int l=0,r=n;
	while(s<sum[r])r--;
	while(l<=r){
		w=0;
		for(int i=1;i<=m;i++){
			a[i]=c[i];
		}
		int mid=(l+r)>>1;
		if(dfs(mid,1,mid))l=mid+1;
		else r=mid-1;
	}
	printf("%d",l-1);
	return 0;
}

80分代码:pos从小到大。

#include<bits/stdc++.h>
using namespace std;
const int N=51,M=1e3+5;
int m,n,a[N],b[M],c[N],sum[M],s=0,w=0;
bool dfs(int pos,int st,int mid){
	if(pos==mid+1)return 1;
	if(s-w<sum[mid])return 0;
	for(int i=st;i<=m;i++){
		if(a[i]>=b[pos]){
			a[i]-=b[pos];
			if(a[i]<b[1])w+=a[i];
			if(b[pos]!=b[pos-1]){
				if(dfs(pos+1,1,mid))return 1;
			}
			else{
				if(dfs(pos+1,i,mid))return 1;
			}
			if(a[i]<b[1])w-=a[i];
			a[i]+=b[pos];
		}
	}
	return 0;
}
int main(){
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d",&c[i]);
		s=s+c[i];
	}
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&b[i]);
	}
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+b[i];
	}
	int l=0,r=n;
	while(s<sum[r])r--;
	while(l<=r){
		w=0;
		for(int i=1;i<=m;i++){
			a[i]=c[i];
		}
		int mid=(l+r)>>1;
		if(dfs(1,1,mid))l=mid+1;
		else r=mid-1;
	}
	printf("%d",l-1);
	return 0;
}
2023/12/2 15:05
加载中...