c++之股票低买高卖问题

题目描述
你有预测股票的能力:可以知道某只股票未来 N 天的价格。

你当然准备通过这项能力获利,但为了不让别人发现你的“钞能力”,只打算每天最多交易一股股票。也就是说,每天你要么买入一股,要么卖出一股(当你没有任何股票时,你就不能出售),要么什么都不做。

最初你拥有零股,但可以融资(借钱)。在 N 天结束后,你要把借来的钱还回去,同时帐下恢复零股。

现在问题来了:通过最合理的买卖,你可以从这 N 天内赚到多少钱。

输入格式
第一行输入一个数,表示 N。
接下来一行是 N 个数,
pi表示股票在第n天的价格

输出格式
输出一个数 M,表示这 N 天最多可以赚到的利润。

输入输出样例:

输入1:

9
10 5 4 7 9 12 6 2 10

输出1:

20

这是一个经典的股票买卖问题,可以使用贪心算法来解决。

具体思路是,在每个价格上升的阶段买入,在价格下降的阶段卖出,即对于第i天,如果pi>pi−1,则将第i−1天买入,第i天卖出,否则不进行操作。最终累加所得到的利润即可。

这就是连续区间最大和
https://blog.csdn.net/u011416077/article/details/123780095

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/715875
  • 这篇博客也不错, 你可以看下问题:同一个进程中,先后对同一个文件描述符进行写入 / 读取 操作,读写指针的位置导致读取内容失败
  • 除此之外, 这篇博客: C与C++程序设计学习笔记中的 8、一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。比如121,2332 都是回文数,13,4567不是回文数。任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得到一个新的数,如果新数不是回文数,重复这个变换,直到得到一个回文数为止。例如,57变换后得到132(57 + 75),132得到363(132 + 231)),363是一个回文数。曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定能得出一个回文数。至今这个猜想还没有被证明是对的。现在请你通过程序来验证。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 输入一行一个正整数n。

    输出第一行一个正整数,表示得到一个回文数的最少变换次数。
    接下来一行,输出变换过程,相邻的数之间用"—>"连接。输出格式可以参见样例。
    保证最后生成的数在int范围内。

    349
    
    3
    349--->1292--->4213--->7337
    
    #include <stdio.h>
    #include <math.h>
    int isPalindrome(int x) //如果传入的正整数是回文数则返回1,否则返回0
    {
    	if (x < 0) return 0;
    	else if (x == 0) return 1;	
    	else
    	{
    		int i = 0, j = 0, a[100] = { 0 };
    		while (x > 0)
    		{
    			a[i] = x % 10;
    			i++;
    			x = x / 10;
    		}
    		for (j = 0; j <= (i - 1) / 2; j++)
    		{
    			if (a[j] != a[i - 1 - j]) return 0;
    		}
    		return 1;
    	}
    }
    int fz(int x) //返回翻转后的正整数
    {
    	int a[100] = { 0 }, i = 0, y = 0, j = 0;
    	while (x > 0)
    	{
    		a[i] = x % 10;
    		i++;
    		x = x / 10;
    	}
    	i--;
    	for (j = 0; j <= i; j++)
    	{
    		y += a[j] * pow(10, i - j);
    	}
    	return y;
    }
    int main(void)
    {
    	int k = 0, i = 0, a[100] = { 0 }, j = 0;
    	scanf("%d", &k);
    	while (isPalindrome(k) == 0)
    	{
    		a[i] = k;
    		k += fz(k);
    		i++;
    	}
    	printf("%d\n", i);
    	for (j = 0; j < i; j++)
    	{
    		printf("%d--->", a[j]);
    	}
    	printf("%d", k);
    	return 0;
    }