2 条题解
-
0
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
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
- 上传者