涨价
我们有 n 个物品,每个物品有一个初始价值 v_i。可以进行 k 次涨价操作,每次操作可以选择任意一个物品,将其价值平方(即 x = x * x),但每个物品只能被涨价一次。然后有 m 次询问,每次询问给定 p 个物品的编号,要求计算这 p 个物品在最优涨价操作后的最大总价值。
输入格式
-
第一行:两个整数
n和k,分别表示物品数量和涨价次数。 -
第二行:
n个整数,表示每个物品的初始价值v_1, v_2, ..., v_n。 -
第三行:一个整数
m,表示询问次数。 -
接下来的
m行:每行一个整数p,表示询问前p个物品的总价值(即v[0], v[1], ..., v[p-1])。
输出格式
对于每个询问 p,输出前 p 个物品在最优涨价操作后的最大总价值。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, k; cin >> n >> k; vector<long long> v(n); for (int i = 0; i < n; ++i) { cin >> v[i]; } // 按价值从大到小排序 sort(v.begin(), v.end(), greater<long long>()); // 对前k个物品进行涨价操作 for (int i = 0; i < min(k, n); ++i) { v[i] = v[i] * v[i]; } // 构建前缀和数组 vector<long long> prefix(n + 1, 0); for (int i = 1; i <= n; ++i) { prefix[i] = prefix[i - 1] + v[i - 1]; } int m; cin >> m; while (m--) { int p; cin >> p; cout << prefix[p] << endl; } return 0; }
浙公网安备 33010602011771号