賽碼編程練習


股神

題目描述

有股神嗎?有,小賽就是!經過嚴密的計算,小賽買了一支股票,他知道從他買股票的那天開始,股票會有以下變化:第一天不變,以后漲一天,跌一天,漲兩天,跌一天,漲三天,跌一天...依此類推。為方便計算,假設每次漲和跌皆為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));
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM