精华 最短股神题目解法
发布于 2016-11-11 00:09 4141 次浏览 0 赞 来自 试题交流  
#include"iostream"
#include"math.h"
using namespace std;
int main()
{
 int a;
 while (cin >> a)
 {
  int n = (pow(1 + 8 * a, 0.5) - 1) / 2;
  int Bn = (n*n + n) / 2;
  cout << (n*n - 3 * n + 4) / 2 + (a - Bn);
 }
 return 0;
}


15 条回复

niu

可以自定义数据,有hack的吗?

2016-11-11 09:25

我的为什么一直90%,楼主能帮忙看看可以吗?

#include <iostream>
#include <istream>

using namespace std;

long long computeShares(int day)
{
  long long share(0);  
  if(day==1)
    share=1;  
  else  
  {
    int dayCount(0),minusPeriod(1);
    bool minus(false);
    int periodCount(0);
    while(dayCount<day)
    {      
      if(minus) 
      {    
        share--;  
        periodCount=0;  
        minusPeriod++; 
        minus=false;   
      }  
      else 
      {  
        share++;   
        periodCount++;  
        if(periodCount==minusPeriod) 
          minus=true;
      }   
      dayCount++;   
    }  
  }
  return share;
}

int main()
{
  int day(0);
  while(cin>>day)    
    cout<<computeShares(day)<<endl;

  return 0;
}

2016-11-11 09:49
#include<iostream>
using namespace std;

int getMoney(int n){
 if(n<=2){
     return n;
    }else{
     int i = 0 , j=0 , k = 2;
       while(k<n){
         i++;
           j+=i+1;
           k=i+j;
        }
       return n-2*i;
    }
}
int main(){
 int n;
   while(cin>>n){
     cout<<getMoney(n)<<endl;
    }
   return 0;
}

一样也是90%,是不是数据有问题啊!

2016-11-11 10:36

额,先说下我的思路吧,纯数学题的感觉。

题目中前几天的股价变化是1 2 | 1 2 3| 2 3 4 5| 4 5 6 7 8|.......,分别是2,3,4,5项,并且每项之间都是递增的,也就是说我们需要找到所求天数所在的区间,求出下限的股价值,再用输入的天数减去下限,便是下限的股价值应该加上的值,即所求的股价值。

额,好像没说清。。。。。

选取每一项的第一项,即1,1,2,4,7......,规律出来了,每项之间相隔一个 0,1,2,3.......这样的一个等差数列。

于是。。。。

n      1    2     3     4      5   

Bn    1    3     6     10    15   (实际天数)

Cn    1    1     2      4      7   (股价)


Bn与n间存在明显的关系,同样,Cn与n也存在关系。于是:

Cn=(n*n-3*n+4)/2;Bn=(n*n+n)/2;

设输入天数为a,则n*n+n=2*a;对所求的n下取整即为所求下限Bn所代表的n值,则Bn与Cn可求,即得出第a天的股价

P.S. 楼主在本周日有在线笔试,所以抱歉暂时不能帮你们看了,不过你们也可以把你们代码的思路发出来0.0;相互借鉴学习啊

数据是没问题的。。。。。

2016-11-11 13:41
4
coder_2FEZDW7V 回复 奉先

大兄弟,你这个初值设的有问题啊 天数和钱数应该上来就是1吧

2016-11-11 14:18
奉先 回复 coder_Z7VABJ3B

我的思路是这样的:通过控制minus来判断每一天是上涨还是下跌 在每次下跌的时候对接下来上涨的天数定义 股价上涨完了之后控制minus进入股价下跌,不知道问题出在了哪里,一直是90%

2016-11-11 14:42

上面的coder_2FEZDW7V说的没错。。。犯了低级错误,重新修改了一下,可以AC了!感谢各位大神!

#include <iostream>
#include <istream>

using namespace std;

long long computeShares(int day)
{
  long long share(1);  //long long share(0);
  if(day==1)
    share=1;  
  else  
  {
    int dayCount(1)/*已过天数int dayCount(0)*/,minusPeriod(1);
    bool minus(false);//股票下跌标记
    int periodCount(0);
    while(dayCount<day)
    {      
      if(minus) 
      {    
        share--;  
        periodCount=0;  
        minusPeriod++; 
        minus=false;   
      }  
      else 
      {  
        share++;   
        periodCount++;  
        if(periodCount==minusPeriod) 
          minus=true;
      }   
      dayCount++;   
    }  
  }
  return share;
}

int main()
{
  int day(0);
  while(cin>>day)    
    cout<<computeShares(day)<<endl;

  return 0;
}


2016-11-11 14:55
我腻害不! 回复 coder_Z7VABJ3B

好伟大的思维。。。忽然理解老师说了无数次的不要着急上去就干。。。先想清楚。。。

2016-11-11 14:57
pyy0472 回复 coder_Z7VABJ3B

膜拜下大神~现在还有笔试么~大部分不都发完offer了么~

2016-11-11 16:14
fwm94 回复 offer上岸

你的程序在输入4的时候输出了0,但是答案应该是2,你再查查代码吧。

2016-11-12 00:20

大神啊都

2016-11-13 11:24

请收下我的膝盖

2016-11-14 10:12

膜拜下各楼大神!

2016-11-14 18:00
1

表示想学这种算法,我对这类型的题都不会,向跟大神学习,这种题怎么做,怎么下手?

2019-04-28 20:03

师弟师妹,师兄帮你内推阿里巴巴

师兄微信号: alibabazp

师兄专门为你排忧解难,同时赠送相关学习资料。

内推贴:

https://discuss.acmcoder.com/topic/5d50cb6751f256de05b3dd5a


2019-08-15 19:20
添加回复
回到顶部