股神
題目描述有股神嗎?有,小賽就是!經過嚴密的計算,小賽買了一支股票,他知道從他買股票的那天開始,股票會有以下變化:第一天不變,以后漲一天,跌一天,漲兩天,跌一天,漲三天,跌一天...依此類推。為方便計算,假設每次漲和跌皆為1,股票初始單價也為1,請計算買股票的第n天每股股票值多少錢?
輸入:
輸入包括多組數據;
每行輸入一個n,1<=n<=10^9 。
輸出:
請輸出他每股股票多少錢,對於每組數據,輸出一行。
我的思路:
首先看到這種序列問題,第一想到的就是暴力破解,用一個數組存儲所有的數據,這樣做可以解決數據量較少的情況
1 int a[10000]; 2 a[1] = 1; 3 int flag = 1; 4 int temp = 1; 5 for (int k = 2; k<10000; k++){ 6 if (flag>0){ a[k] = a[k - 1] + 1; } 7 if (flag == 0){ a[k] = a[k - 1] - 1; } 8 flag--; 9 if (flag < 0){ 10 temp = temp + 1; 11 flag = temp; 12 } 13 }
上述代碼就是簡單的遍歷,k是n的大小,當我的k過大時程序崩潰,解決不了10e9的情況,所以這個題沒法用這個思路解決。怎么辦,我考慮到給定n時,我們可以根據它之前下跌過幾天和它在最后一次下跌后上漲了幾天,我最開始考慮到的是等差數列求和公式,假設沒有下跌的情況 s=n+n(n-1)/2,求出這個n就是k天一共有n天下跌了。舉個例子 3=2+2*(2-1),第三天經歷一次下跌,n=2,股價變為k-2*(n-1)=1;第4天和第5天的情況和第3天一樣,而第六天6=3+3*(3-1);n=3,股價變為k-2*(n-1)=2;這樣可以看到s=n+n(n-1)/2和s<n+1+(n+1)*n的情況都是股價下跌n-1天。
#include "stdafx.h" #include<stdio.h> #include <iostream> using namespace std; int main() { int n; while (cin>>n){ int i; for (i = 1; i <= n; i++){ int s; s = i + i*(i - 1) / 2; if (s == n){ break; } if (s > n){ i = i - 1; break; } } if (n == 1) printf("1\n"); if (n == 2) printf("2\n"); if (n == 3) printf("1\n"); if(n>3) printf("%d\n", n-2*(i-1)); } }