题目来源码蹄集
解析:本题应该为贪心算法---升序排序后,从小往大选即可,最后一个数判断减半是否能放入。
难点在于排序之后找不到原来的那个数(p+s)的打折价(p/2+s),所以本题使用两重vector容器即可,temp[i][0]表示p+s价格,temp[i][1]表示p/2+s价格,排序是按照temp[i][0]值升序排列。
代码:
#include<bits/stdc++.h>
using namespace std;
bool cmp(vector<int> a,vector<int> b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
int main()
{
//肯定是贪心算法,排完序之后,看最后一个能不能放
vector<vector<int>> temp;
int N, B;
cin >> N >> B;
for (int i = 1; i <= N; i++) {
int p, s;
cin >> p >> s;
temp.push_back({ p + s,p / 2 + s });
}
sort(temp.begin(), temp.end(), cmp);
//ssum用于装载
int ssum = 0;
int scount = 0;
for (int i = 0; i < N; i++) {
if (temp[i][0] <= (B - scount)) {
scount += temp[i][0];
ssum++;
}
else if (temp[i][1] <= (B - scount)) {
ssum++;
break;
}
else break;
}
cout << ssum;
return 0;
}