百度之星2024 初赛第一场 补给

题干描述:

BD202401补给

可怕的战争发生了,小度作为后勤保障工作人员,也要为了保卫国家而努力。

现在有 𝑁(1≤𝑁≤103)个堡垒需要补给,然而总的预算 𝐵(1≤𝐵≤109)是有限的。

现在已知第 𝑖 个堡垒需要价值 𝑃(𝑖)的补给,并且需要 𝑆(𝑖)的运费。
鉴于小度与供应商之间长期稳定的合作关系,供应商慷慨地提供了一次特别的采购优惠。具体而言,小度可以选择对某次补给进行半价采购。
这意味着,如果小度决定在向第 𝑖 个堡垒提供补给时利用这一优惠,那么此次补给的采购及运输总费用将减少至 ⌊𝑃(𝑖)/2⌋+𝑆(𝑖),其中优惠价格按照向下取整的原则计算。
对于其他堡垒 j,补给的采购和运输费用则保持不变,即 𝑃(𝑗)+𝑆(𝑗)。

请计算小度的最多能给多少堡垒提供补给?

格式

输入格式:

第1行2个整数:𝑁和 𝐵 。(1≤𝑁≤103,1≤𝐵≤109);
第2到 𝑁+1行:第 𝑖+1 行包含两个空格分隔的整数,𝑃(𝑖)和𝑆(𝑖)。(0≤P(i),S(i)≤10^9)。

输出格式:

1 行 1 个整数表示能提供补给的最大数。

样例 1

输入:

5 29
6 3
2 8
10 2
1 2
12 5

复制

输出:

4

思路:

首先先讲他给的n组数据进行排序,按照 运费和补给费用的和从小到大进行排序,然后依次和B进行比较,如果小于等于B的话,就ans++,同时B减小,然后对于不满足的堡垒,计算一下如果P[i]减半的话,能否满足,看就是看ans能不能再多一个了(算是特判一下吧,可能用这个词不是很准确)。

代码实现:

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>

using namespace std;

typedef long long ll;

const int N=1010;

struct node
{
    ll p;
    ll s;
    ll sum;
}a[N];

bool cmp(node x,node y)
{
    return x.sum<y.sum;
}

int ans;

int main()
{
    int n,B; cin>>n>>B;
    for(int i=1;i<=n;i++) cin>>a[i].p>>a[i].s;
    for(int i=1;i<=n;i++) a[i].sum=a[i].p+a[i].s;
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        if(B>=a[i].sum)
        {
            B-=a[i].sum;
            ans++;
        }
        else
        {
            if(B>=floor(a[i].p/2)+a[i].s)
            {
                ans++;
                break;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值