股神

1:题目描述

有股神吗?

有,小赛就是!

经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推。

为方便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?

输入

 

输入包括多组数据;

每行输入一个n,1<=n<=10^9 。

 

样例输入

1

2

3

4

5

输出

 

请输出他每股股票多少钱,对于每组数据,输出一行。

 

样例输出

 

1

2

1

2

3

2:题目分析

  这也算动态规划吗?当然也算降价的天数是规律的,我们可以求出哪些天是降价的,然后统计所有降价的天数,这样可以直接求得当前的价格。

  求降价天数的递归表达式:

1,2, 3,4,5, 6,7,8,9,10,11,12,13,14,15,

0,1,-1,1,1,-1,1,1,1, -1,  1,  1,  1,  1, -1,

上面一行为第几天,下面为涨降的情况。

a0 = 3
a1 = 6
a2 = 10
a3 = 15
a4 = 21

a1 - a0 = 3
a2 - a1 = 4
a3 - a2 = 5
a4 - a3 = 6
...
an+1 - an = n+3

an+1 - a0 = 3 + 4 + 5 + 6 +...+ n+3 = (n+6)*(n+1)/2

an+1 = (n+6)*(n+1)/2 + 3;

an = (n+5)*n/2 + 3;

观察第几次降价和第几天的关系,我们可以得到,降价天数的递归表达式,利用该表达式我们可以轻易算出,当前天数里有多少次是降价的,假设每天都是涨价,第n天的价格为n,如果其中有i天使降价1的,则价格就为n - i - i,这是因为不增就减带来的双倍变化。

那么思路就有了,先统计当前天数里有几天降价,然后求得价格即可。

3:代码示例

package sharesGod;

import java.util.Scanner;

/**
 * @author :dazhu
 * @date :Created in 2020/4/9 9:58
 * @description:有股神吗? 有,小赛就是!  经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推。  为方便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?
 * @modified By:
 * @version: $
 */
public class Main {
    public static void main(String[]args){
        Scanner sc = new Scanner(System.in);
        int n = 0;
        while(sc.hasNextInt()){
            n = sc.nextInt();
            System.out.println(getPrice(n));
        }
    }
    public static int getPrice(int n){
        //统计n天内,股票下降的次数。那么当前价格就等于,当前天数n减去2*i
        //因为假设除去下降的天数,其他天数都是加1的,如果假设所有天都是加1,
        //则当前价格和当前天数一样,但是有i天减1,则价格为n-2*i,不增反降。
        int i=0;
        //分析当前的规律,我们可以发现所有降价1的天数的规律如下
        //an = (n+5)*n/2 + 3;
        //n=0,a0 = 3,第一次降价为第三天
        //n=1,a1 = 6,第二次降价为第六天
        //n=2,a2 = 10,第三次降价为第10天
        //n=3,a3 = 15,第四次降价为第15天
        //利用这个公式,统计当前天中降价的次数
        for(int j=0;j<=n;j++){
            //如果降价的日期超过给定,则break
            if((j+5)*j/2+3>n){
                break;
            }
            else{
                //否则,i++统计有多少天降价
                i++;
            }
        }
        return n-2*i;
    }
}

 

posted @ 2020-04-09 11:24  大朱123  阅读(248)  评论(0编辑  收藏  举报