股神
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; } }