京东C++开发工程师2020春(编程1)

题目描述:

最近经济不景气,小 A 准备将持仓的股票抛售一部分。
他共持有n支股票,受交易平台的限制,他每天最多只能卖出 m 支股票.
已知第 i 支股票每天会亏损 a_i 元,即如果第k天抛售这支股票,亏损的数额是 k* a_i 元。
现在他还没有决定具体卖出多少支股票,所以他会给你若干个询问,即如果卖出 q 支股票,
这 q 支股票最少的亏损数额是多少元。

输入

输入第一行包含两个正整数 n 和 m,表示小 A 持仓的股票数量和每天最多能卖出的股票数量。(1<=n,m<=50000)
输入第二行包含n个正整数,第 i 个数 a_i 表示第 i 支股票每天的亏损数额。(1<=a_i<=10000)
接下来一行有一个正整数Q,表示询问的数量。(1<=Q<=50000)
之后有Q行,每行一个正整数q,表示假如要卖出q支股票,最少的亏损数额是多少元。(q<=n)

输出

对于每个询问,输出对应的结果。

样例输入

5 2
1 2 3 4 5
2
3
5

样例输出

7
22

提示

样例解释:
一共有5支股票,每天最多可以抛售2支。
q为2,即有两个询问。
针对第一个询问3,需要抛售3支股票,当选择1、2、3号股票时损失最小。
其中第一天抛售2、3号股票,损失为5元;第二天抛售1号股票,损失为2* 1=2元;最后合计损失为7元。
针对第二个询问5,需要抛售第1、2、3、4、5号股票。
其中第一天抛售4、5号股票,损失为9元;第二天抛售2、3号股票,损失为2* 2+2* 3=10元;
第三天抛售1号股票,损失为3* 1=3元;最后合计损失22元。

代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int question(int m, int qi, vector<int> a) {
    
    

	int day = qi / m;
	int remainder = qi % m, sum = 0;

	if (remainder != 0) {
    
    
		for (int i = 1; i <= remainder; i++)
			sum += a[(day)*m + i - 1] * (day + 1);
	}
	for (int d = 0; d < day; d++) {
    
    
		for (int i = 0; i < m; i++) {
    
    
			sum += a[d * m + i] * (d + 1);
		}
	}

	return sum;
}

int main() {
    
    
	int n, m, Q;
	cin >> n >> m;
	vector<int> a(n + 1, 0);
	for (int i = 1; i <= n; i++) {
    
    
		cin >> a[i];
	}
	cin >> Q;
	vector<int> q(Q + 1, 0);
	for (int i = 1; i <= Q; i++) {
    
    
		cin >> q[i];
	}

	sort(a.begin() + 1, a.end(), less<int>());//小到大排序

	for (int i = 1; i <= Q; i++) {
    
    
		vector<int>ai(a.begin() + 1, a.begin() + 1 + q[i]);//选取前qi个
		sort(ai.begin(), ai.end(), greater<int>());//大到小排序
		cout << question(m, q[i], ai) << endl;
	}

	return 0;
}

个人能力有限,可能有错漏,还请评论告知,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_27677599/article/details/105728480
今日推荐