题干描述:
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;
}