HFUT 1290

       这道题是我大一时做的,一直TLE,最近没事,有找出来看看,仍然悲剧的TLE,无奈只好求助于其他大神,终于明白了其中的原因。

       大体思路:题目并不算难,只是有些需要注意的地方。因为数据范围较大,所以不能简单的枚举,需要近似算出一个结果。通过题意分析,我们可以得到公式:v*[(k^p-1)/k^(p-1)*(k-1)]>=n。然后将(k^p-1)/k^(p-1)*(k-1)放大得到k/(k-1),不过其实在放大之前按照上面这个公式计算,(k^p-1)/k^(p-1)*(k-1)已经比按题意计算要大,因为题目里除法都是整除,而这里是数学的等比数列求和公式,不会把小数丢掉,当然这不是此题关键。此时我们已经得到近似于结果的v了,然后根据v<k^p,就可以得出结果了。

        需要注意的地方:前面的思路我想大家都没问题,关键是要注意此题的数据范围较大,如果不注意很容易爆掉。主要注意两个地方,一是估算v的时候,如果v是int类型,还用v=n*(k-1)/k,那么你一定TLE,二是下面这种情况:

        while(true)
        {                   
            sum=v;
            t=k;
            while(v>=t)
            {
              sum+=v/t; 
              t*=k;           
            } 
            if(sum>=n) break; 
            v++;      
        }     
在n=10^9,k=9时,t也会爆掉。该注意的地方差不过就这些~

           最后,索性总结一下我自己认为会TLE的一些情况。第一,可能是算法问题,复杂度太高;第二,可能有死循环;第三,当你用scanf读入数据,需要用EOF结束输入时你没用;第四,就是此题的情况,没有注意数据范围,计算时爆掉了,导致数字变成负数,与正确答案相差甚远,导致超时。欢迎大家补充其他情况~

代码(G++):

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
    int n,k,v,sum,t;
    
    while(scanf("%d %d",&n,&k)!=EOF)
    {       
        v=1.0*n/k*(k-1);
        while(true)
        {                   
            sum=0;
            t=v;
            while(t>0)
            {                      
              sum+=t;
              t/=k;   
              //cout<<"t = "<<t<<endl;         
            } 
            if(sum>=n) break; 
            v++;      
        }         
        printf("%d\n",v);          
    }
    return 0;
}

题目( http://acm.hfut.edu.cn/OnlineJudge/):

敲代码      

Time Limit: 1000 MSMemory Limit: 65536 KB
  

Description


一天devtang被安排了一个很重要的任务,就是必须要一天之内写完n行代码。所以他不得不熬夜写代码。不过他实在太困了,于是他决定按下面的方式写代码:开始的时候,他先写v行代码,然后喝一杯茶,接着他再写  v/k行,然后再喝一杯茶,接着他再写v/(k^2)行,然后再喝一杯茶,如此的进行下去,直到出现一个整数p使得v/(k^p)为0。这时候devtang已经困的不行了,他就会一觉睡到第二天,不过任务还是必须要完成的。(注意是整数除法)现在他需要你帮他求出最小的v,且必须要完成任务。

Input


输入有多组数据,每组只有2个数据n和k,分别表示总共需要完成的代码量和上面所述的k。(1<=n<=10^9,2<=k<=10)

Output


每组输出只有一个数字,就是v。

Sample Input


7 2
59 9

Sample Output


4
54

Hint


对于第一组数据,他开始先写4行代码,接着写2行,接着写1行,然后devtang就入睡了。故总共写了4+2+1=7,完成任务

对于第二组数据,他开始先写54行代码,接着他写6行,然后devtang就入睡了,故总共写了54+6=60>59。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值