股票及时止损问题
1.问题描述
有n支股票,每天最多卖m支,需要卖出的股票数为q, 每支股票对应一个价格,每晚一天卖出,则亏损数=价格*天数。求最少亏损。
2.输入数据格式
5 2 第一行表示有5支股票 每天最多卖出2支
1 2 3 4 5 每支股票的价格
3 需要卖出3支股票
5 需要卖出5只股票
输出:3支的话应该是第一天卖出1*(2+3)=5 第二天卖出 2*1=2 最少亏损为5+2=7
5支的话应该是1*(5+4)+2*(3+2)+3*1=22
3.解决思路
1》需要卖出股票数q小于每天最多卖出的m,此时只要一天就可以全卖掉,只需要所有价格中最小的q个值相加(这里我们可以对价格排序)。
2》q>m, 第一步计算有多少个m, 然后从排序的价格中的第q-1个开始反向计算。第二步计算剩余的不足m个的。
4.具体实现
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <set>
#include <string>
#include <vector>
using namespace std;
/*股票及时止损 这里我只实验了一组数据,直接给的数据值*/
int main()
{
int n = 5; //股票总数
int m = 2; //最多卖出的股票数
//股票价格 我这里是顺序,所以就没有用sort(排序),
//不然的话,只需要加一个sort(second.beign().second.end())
vector<int> second;
for (int i = 0; i < 5; i++)
{
second.push_back(i + 1);
}
vector<int> q;
q.push_back(3); //需要卖出3支股票
q.push_back(5); //需要卖出5支股票
//这个是q的长度作为循环
for (int i = 0; i < 2; i++)
{
int sum = 0;
if (q[i] <= m) //第一种情况
{
for (int i = 0; i < m; i++)
{
sum += second[i];
}
cout << sum << endl;
}
else //第二种情况
{
int day = 1;
int tt = q[i] % m;
while (q[i] > tt) //第一步
{
int rev = 0;
//从q[i]-1的位置反向计算,每次计算m个
for (int j = q[i]-1; j > q[i] - m - 1; j--)
{
rev += day*second[j];
}
day++;
sum += rev;
q[i] = q[i] - m;
}
for (int k = 0; k < tt; k++) //第二步
{
sum += day*second[k];
}
cout << sum << endl;
}
}
system("pause");
return 0;
}
输出结果
如有问题,请指出纠正。