贪心(入门)-acwing-1055. 股票买卖 II
题目:
给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
输入格式
第一行包含整数 N,表示数组长度。
第二行包含 N 个不大于 10000 的正整数,表示完整的数组。
输出格式
输出一个整数,表示最大利润。
数据范围
1≤N≤105
输入样例1:
6
7 1 5 3 6 4
输出样例1:
7
输入样例2:
5
1 2 3 4 5
输出样例2:
4
输入样例3:
5
7 6 4 3 1
输出样例3:
0
样例解释
样例1:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。共得利润 4+3 = 7。
样例2:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
样例3:在这种情况下, 不进行任何交易, 所以最大利润为 0。
题解:
目 光 短 浅 , 贪 婪 , 遇 涨 则 卖 : 目光短浅,贪婪,遇涨则卖: 目光短浅,贪婪,遇涨则卖:
设 第 i 天 股 票 的 价 格 p r i c e i , 那 么 对 于 第 j ( j > i ) 天 卖 出 第 i 天 购 进 的 股 票 获 得 的 利 润 为 p r i c e j − p r i c e i 。 设第i天股票的价格price_i,那么对于第j(j>i)天卖出第i天购进的股票获得的利润为price_j-price_i。 设第i天股票的价格pricei,那么对于第j(j>i)天卖出第i天购进的股票获得的利润为pricej−pricei。
p r i c e j − p r i c e i = p r i c e j − p r i c e j − 1 + p r i c e j − 1 − p r i c e j − 2 + p r i c e j − 2 − . . . − p r i c e i + 1 + p r i c e i + 1 − p r e i c e i 。 price_j-price_i=price_j-price_{j-1}+price_{j-1}-price_{j-2}+price_{j-2}-...-price_{i+1}+price_{i+1}-preice_i。 pricej−pricei=pricej−pricej−1+pricej−1−pricej−2+pricej−2−...−pricei+1+pricei+1−preicei。
也 就 是 说 : 在 第 i 天 买 入 , 第 j 天 卖 出 , 相 当 于 当 天 买 隔 天 卖 出 即 第 i 天 买 入 , 第 i + 1 天 卖 出 . . . 直 到 第 j 天 卖 出 。 也就是说:在第i天买入,第j天卖出,相当于当天买隔天卖出即第i天买入,第i+1天卖出...直到第j天卖出。 也就是说:在第i天买入,第j天卖出,相当于当天买隔天卖出即第i天买入,第i+1天卖出...直到第j天卖出。
那 么 对 于 N 天 股 票 , 只 要 当 天 比 前 一 天 价 格 高 就 进 行 买 卖 交 易 , 最 大 值 即 所 有 相 邻 价 格 差 大 于 0 利 润 和 。 那么对于N天股票,只要当天比前一天价格高就进行买卖交易,最大值即所有相邻价格差大于0利润和。 那么对于N天股票,只要当天比前一天价格高就进行买卖交易,最大值即所有相邻价格差大于0利润和。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define inf 0x7fffffff
using namespace std;
const int N=1e5+10;
int price[N];
int n;
ll ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&price[i]);
for(int i=2;i<=n;i++)
if(price[i]>price[i-1])
ans+=(price[i]-price[i-1]);
printf("%lld\n",ans);
return 0;
}