这个题其实本质上有两种解法,分别是运用贪心和dp数组进行实现,那么现在先用贪心的方法进行实现
首先你要对魔法A和魔法B进行一个排序,从大到小然后分析n和m的大小(使用greater<int>()建议可以搜索一下),接下来找出最小的那个
在for循环里面寻找,因为你魔法一与魔法二是不同的,魔法一是使用一次后下一次魔法就要乘ai就是说先使用魔法一再使用魔法二就是连续使用两次,魔法二则是直接消耗他的数量,最后进行判断他是否被干掉,如果没有被消灭还要再出来一次n<m,再次进行循环判断,这是因为要考虑到n<m如果没有这种就直接输出-1,这就是这道题的大致思路,现在对在关于比较n和m那个循环开始进行判断,首先对x-bi进行判断如果小于直接输出结果,然后如果ai=1便没有必要对其进行处理,因为接下来使用bi值保持不变,然后是x-bi*ai,结果加二然后这就是大体的思路,我把这个方法的代码贴上来
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N],b[N];
int n,m,x;
void solve() {
cin>>n>>m>>x;
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,greater<int>());
sort(b+1,b+1+m,greater<int>());
int ans=0;
for(int i=1;i<=min(n,m);i++){
if(x-b[i]<=0){
cout<<ans+1<<endl;
return;
}
if(a[i]==1){
x-=b[i];
ans++;
}
else{
x-=b[i]*a[i];
ans+=2;
if(x<=0){
cout<<ans<<endl;
return;
}
}
}
if(n<m){
for(int i=m+1;i<=n;i++){
x-=b[i];
ans++;
if(x<=0){
cout<<ans<<endl;
return;
}
}
}
cout<<-1<<endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t=1;
// cin>>t;
while(t--) {
solve();
}
return 0;
}