[CF3B] Lorry
Description
有一辆载重量为 v 的货车,准备运送两种物品。物品 A 的重量为 1,物体 B 的重量为 2,每个物品都有一个价值。求货车可以运送的物品的最大价值。
Solution
枚举运多少个 B 物品,剩下的排序即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
signed main()
{
ios::sync_with_stdio(false);
int n, v;
cin >> n >> v;
vector<pair<int, int>> a, b;
for (int i = 1; i <= n; i++)
{
int t, p;
cin >> t >> p;
if (t == 1)
a.push_back({p, i});
else
b.push_back({p, i});
}
sort(a.begin(), a.end());
reverse(a.begin(), a.end());
sort(b.begin(), b.end());
reverse(b.begin(), b.end());
vector<int> sa(n + 2), sb(n + 2);
for (int i = 1; i <= a.size(); i++)
sa[i] = sa[i - 1] + a[i - 1].first;
for (int i = 1; i <= b.size(); i++)
sb[i] = sb[i - 1] + b[i - 1].first;
for (int i = a.size() + 1; i <= n; i++)
sa[i] = sa[i - 1];
for (int i = b.size() + 1; i <= n; i++)
sb[i] = sb[i - 1];
int ans = 0, ans_a = 0, ans_b = 0;
for (int i = 0; i <= n; i++)
{
int w_b = 2 * i;
int v_b = sb[i];
int w_a = v - w_b;
if (i > b.size())
continue;
if (w_a < 0)
break;
if (w_a > a.size())
w_a = a.size();
int v_a = sa[w_a];
ans = max(ans, v_a + v_b);
if (ans == v_a + v_b)
ans_a = w_a, ans_b = i;
}
cout << ans << endl;
for (int i = 1; i <= ans_a; i++)
cout << a[i - 1].second << " ";
for (int i = 1; i <= ans_b; i++)
cout << b[i - 1].second << " ";
}