马蹄集 BD202401补给
可怕的战争发生了,小度作为后勤保障工作人员,也要为了保卫国家而努力。
现在有 N(1≤N≤)个堡垒需要补给,然而总的预算 B(1≤B≤
)是有限的。
现在已知第 i 个堡垒需要价值 P(i) 的补给,并且需要 S(i) 的运费。
鉴于小度与供应商之间长期稳定的合作关系,供应商慷慨地提供了一次特别的采购优惠。具体而言,小度可以选择对某次补给进行半价采购。
这意味着,如果小度决定在向第 i 个堡垒提供补给时利用这一优惠,那么此次补给的采购及运输总费用将减少至 ⌊P(i)/2⌋+S(i),其中优惠价格按照向下取整的原则计算。
对于其他堡垒 j,补给的采购和运输费用则保持不变,即 P(j)+S(j)。
请计算小度的最多能给多少堡垒提供补给?
格式
输入格式:
第1行2个整数:N 和 B 。(1≤N≤,1≤B≤
);
第2到 N+1 行:第 i+1 行包含两个空格分隔的整数,P(i)和S(i)。(0≤P(i),S(i)≤)。
输出格式:
1 行 1 个整数表示能提供补给的最大数。
样例 1
输入:
5 29 6 3 2 8 10 2 1 2 12 5
输出:
4
贪心:
按照 p和s 的总和升序排序,剩余的预算不够时,看是否满足 剩余的预算>下一个堡垒的p/2,满足则ans++
#include<bits/stdc++.h>
using namespace std;const int N = 1e3+10;
int n, b;
int ans;struct BL
{int p;int s;
}bl[N];bool cmp(BL x, BL y)
{return x.p+x.s < y.p+y.s;
}int main()
{cin>>n>>b;for(int i=1; i<=n; ++i) cin>>bl[i].p>>bl[i].s;sort(bl+1, bl+n, cmp);for(int i=1; i<=n; ++i){if(b > bl[i].p+bl[i].s){b -= bl[i].p+bl[i].s;ans++;}else if(b > bl[i].p/2+bl[i].s){b -= bl[i].p/2+bl[i].s;ans++;}else break;}cout<<ans<<endl;return 0;
}