题意: 解法: 显然对a[]和b[]从大到小排序, 因为选择k个A,一定是选择前k大的. 然后枚举选择的A的个数x, 二分出能选择的最大的B的个数y, 用A前x大和B前y大的和更新答案即可. 发现当选择A的个数x递增的时候,y一定是递减的, 因此开一个指针维护y即可. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=1e6+5; int a[maxm]; int b[maxm]; int n,m,s,A,B; bool cmp(int a,int b){ return a>b; } void solve(){ cin>>n>>m>>s>>A>>B; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=m;i++){ cin>>b[i]; } sort(a+1,a+1+n,cmp); sort(b+1,b+1+m,cmp); for(int i=1;i<=n;i++){ a[i]+=a[i-1]; } for(int i=1;i<=m;i++){ b[i]+=b[i-1]; } int ans=0; int j=m; for(int i=0;i<=n;i++){ if(i*A>s)break; while(i*A+j*B>s)j--; ans=max(ans,a[i]+b[j]); } cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0);cin.tie(0); solve(); return 0; }