小白月赛83B小天的魔法

这个题其实本质上有两种解法,分别是运用贪心和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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸鱼di咖波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值