C The Party and Sweets(思维 + 贪心)

题目链接

题意:n个男孩,m个女孩,第i个男孩送出的最小糖果为b[i],送给m个女孩,第i个女孩收到的最小的糖果为g[i],且b[i],g[i],全部要取到,问送出的最少糖果

题解:明显可以贪心做。
先对b[i] 和g[i]进行排序,首先n个男孩肯定要送出b[i],可以求出此时最小的一个值∑b[i] * m 。同时所有的g[i]要取到,那么便遍历一遍g[i]-b[n-1],解释:首先要取最小,先满足min(b[i]) > max [g[i]) ,所以对最大的b[i]必然可以取n-1个g[i],如果g[0]!=b[n-1],那么最大的b[i]就要取自身的值,此时只要b[n-2]取即可。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
ll n, m, k, ans, mod=1e9+7;
ll g[101010], b[101010];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll i, j, temp=0;
    cin>>n>>m;
    for(i=0;i<n;i++)
        cin>>b[i];
    for(i=0;i<m;i++)
        cin>>g[i];
    sort(b, b+n);
    sort(g, g+m);
    if(b[n-1]>g[0])
    {
        cout<<"-1";
        return 0;
    }
    for(i=0;i<n;i++)
        ans+=b[i];
    ans*=m;
    for(i=1;i<m;i++) ans+=g[i]-b[n-1];
    if(g[0]!=b[n-1]) ans+=g[0]-b[n-2];
    cout<<ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值