2 条题解

  • 0
    @ 2025-10-8 17:02:46

    by 卡常的hansang:

    #include <bits/stdc++.h>
    using namespace std;
    const int N=55, M=1010;
    int a[N], b[M], d, sa[N], sb[M], n, m, sum, w;
    bool dfs(int x, int last){
    	if(sum - w < sb[d]) return 0;
    	if(x == 0) return 1;
    	for(int i=last; i <= n; i++) if(sa[i] >= b[x]){
    		sa[i] -= b[x]; 
    		if(sa[i] < b[1]) w += sa[i];
    		if(b[x] == b[x-1]){
    			if(dfs(x-1, i)) return 1;
    		}
    		else if(dfs(x-1, 1)) return 1;
    		if(sa[i] < b[1]) w -= sa[i];
    		sa[i] += b[x]; 
    	}
    	return 0;
    }
    bool check(int mid){
    	d = mid; w = 0;
    	for(int i=1; i <= n; i++) sa[i] = a[i];
    	return dfs(mid, 1);
    }
    int main(){
    	scanf("%d", &n); sum = 0;
    	for(int i=1; i <= n; i++) scanf("%d", &a[i]), sum += a[i];
    	scanf("%d", &m);
    	for(int i=1; i <= m; i++) scanf("%d", &b[i]);
    	sort(b+1, b+m+1);
    	sb[0] = 0; for(int i=1; i <= m; i++) sb[i] = sb[i-1] + b[i];
    	while(sb[m] > sum && m > 0) m--;
    	int l = 0, r = m, ans;
    	while(l <= r){
    		int mid = (l + r) / 2;
    		if(check(mid)) l = mid + 1, ans = mid;
    		else r = mid - 1;
    	}
    	printf("%d\n", ans);
    	return 0;
    }
    
    • 0
      @ 2025-10-8 17:02:32

      by 卡常的hansang:

      #include<bits/stdc++.h>
      using namespace std;
      const int N=55, M=1010;
      int a[N], b[M], d, sa[N], sb[M], n, m, sum, w;
      bool dfs(int x, int last){
      	if(sum-w<sb[d]) return 0;
      	if(x==0) return 1;
      	for(int i=last; i<=n; i++) if(sa[i]>=b[x]){
      		sa[i]-=b[x]; 
      		if(sa[i]<b[1]) w+=sa[i];
      		if(b[x]==b[x-1]){
      			if(dfs(x-1, i)) return 1;
      		}
      		else if(dfs(x-1, 1)) return 1;
      		if(sa[i]<b[1]) w-=sa[i];
      		sa[i]+=b[x]; 
      	}
      	return 0;
      }
      bool check(int mid){
      	d=mid; w=0;
      	for(int i=1; i<=n; i++) sa[i]=a[i];
      	return dfs(mid, 1);
      }
      int main(){
      	scanf("%d", &n); sum=0;
      	for(int i=1; i<=n; i++) scanf("%d", &a[i]), sum+=a[i];
      	scanf("%d", &m);
      	for(int i=1; i<=m; i++) scanf("%d", &b[i]);
      	sort(b+1, b+m+1);
      	sb[0]=0; for(int i=1; i<=m; i++) sb[i]=sb[i-1]+b[i];
      	while(sb[m]>sum && m>0) m--;
      	int l=0, r=m, ans;
      	while(l<=r){
      		int mid=(l+r)/2;
      		if(check(mid)) l=mid+1, ans=mid;
      		else r=mid-1;
      	}
      	printf("%d\n", ans);
      	return 0;
      } 
      • 1

      信息

      ID
      2735
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      递交数
      32
      已通过
      12
      上传者