BD202401补给
题目
可怕的战争发生了,小度作为后勤保障工作人员,也要为了保卫国家而努力。
现在有 N(1≤N≤103)N(1≤N≤103)个堡垒需要补给,然而总的预算 B(1≤B≤109)B(1≤B≤109)是有限的。
现在已知第 ii 个堡垒需要价值 P(i)P(i) 的补给,并且需要 S(i)S(i) 的运费。
鉴于小度与供应商之间长期稳定的合作关系,供应商慷慨地提供了一次特别的采购优惠。具体而言,小度可以选择对某次补给进行半价采购。
这意味着,如果小度决定在向第 ii 个堡垒提供补给时利用这一优惠,那么此次补给的采购及运输总费用将减少至 ⌊P(i)/2⌋+S(i)⌊P(i)/2⌋+S(i),其中优惠价格按照向下取整的原则计算。
对于其他堡垒 jj,补给的采购和运输费用则保持不变,即 P(j)+S(j)P(j)+S(j)。
请计算小度的最多能给多少堡垒提供补给?
输入格式:
第1行2个整数:NN 和 BB 。(1≤N≤103,1≤B≤109)(1≤N≤103,1≤B≤109);
第2到 N+1N+1 行:第 i+1i+1 行包含两个空格分隔的整数,P(i)P(i)和S(i)S(i)。(0≤P(i),S(i)≤109)(0≤P(i),S(i)≤109)。
输出格式:
1 行 1 个整数表示能提供补给的最大数。
解题思路
这个题是包含排序和贪心的思想。
使用结构体存储数据,通过重写sort中的比较函数实现排序。
从小到达进行选择,优惠使用在最后一个堡垒上。
#include<bits/stdc++.h>
using namespace std;struct ex{int p;int s;
}a[1005];
bool cmp(ex x, ex y)
{return x.p + x.s < y.p + y.s;
}
int main( )
{int n, b, ans = 0;cin >> n >> b;for(int i = 0; i < n; i++){cin >> a[i].p >> a[i].s;}sort(a, a + n, cmp);//可以对某次补给提供一次特别的采购优惠//优惠的一次一定是使用在最后的for(int i = 0; i < n; i++){if(b >= a[i].p + a[i].s || b >= floor(a[i].p / 2) + a[i].s){ans++;b -= a[i].p + a[i].s;}else{break;}}cout << ans;return 0;
}