涨价

我们有 n 个物品,每个物品有一个初始价值 v_i。可以进行 k 次涨价操作,每次操作可以选择任意一个物品,将其价值平方(即 x = x * x),但每个物品只能被涨价一次。然后有 m 次询问,每次询问给定 p 个物品的编号,要求计算这 p 个物品在最优涨价操作后的最大总价值。

输入格式

  1. 第一行:两个整数 n 和 k,分别表示物品数量和涨价次数。

  2. 第二行:n 个整数,表示每个物品的初始价值 v_1, v_2, ..., v_n

  3. 第三行:一个整数 m,表示询问次数。

  4. 接下来的 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;
}

 

posted @ 2025-08-09 20:28  最近饭吃的很多  阅读(15)  评论(0)    收藏  举报