赛码编程练习

股神

题目描述

有股神吗?有,小赛就是!经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推。为方便计算,假设每次涨和跌皆为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));
    }
}

 

posted @ 2016-08-07 14:15  沐雨橙风fire  阅读(2336)  评论(0编辑  收藏  举报