链接:
https://codeforces.com/problemset/problem/1539/D
题意:
lena买东西,每件商品有两个属性,一个是lena需要买的数量,一个是需要购买几件商品,商品会打折。每件商品的价格均为2,打折后的价格均为1。问lena最少要花多少钱。
本题可以先升序排序,然后用双指针,先购买b值更大的商品,使小商品打折,再购买打折后的小商品。直到买完所有需要买的商品。
代码如下:
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>
#include<random>
using namespace std;
typedef long long ll;
struct node {
ll a, b;
};
node pro[100003];
bool cmp(node x, node y) {
return x.b < y.b;
}
int main() {
int n;
cin >> n;
ll sum = 0;
for (int i = 0; i < n; i++) {
cin >> pro[i].a >> pro[i].b;
sum += pro[i].a;
}
sort(pro, pro + n, cmp);
ll ans = 0;
ll l = 0, r = n - 1;
ll buy = 0;
while (buy != sum) {
if (buy >= pro[l].b) {
buy += pro[l].a;
ans += pro[l].a;
l++;
}
else if (buy + pro[r].a >= pro[l].b) {
pro[r].a -= pro[l].b - buy;
ans += 2 * (pro[l].b - buy);
buy = pro[l].b;
}
else {
ans += 2 * pro[r].a;
buy += pro[r].a;
r--;
}
}
cout << ans;
cout << endl;
}