问题 C: C

题目描述:

这里有一个数x,我们可以对这个数进行两种操作。
a.每次使这个数减去1,需要A秒钟才能完成此操作。
b.每次使这个数除以k,需要B秒钟才能完成此操作。
问最少需要多少秒种可以使这个数等于1。
输入
输入x,k,A,B,(1<=x,k,A,B<=2*10^9)题目有多组测试数据
输出
最少需要多少秒
样例输入 Copy
5
5
2
20
9
2
3
1
样例输出 Copy
8
6

分析:

这道题可以说是满满的细节了。在做这道题的时候,我一开始以为可以不考虑是不是能被整除,但是后来发现必须是能够整除的数才行。
这道题的因为数据过大,所以不能够用dfs,否则会超时。
那么这道题的话,我们需要考虑到底是执行减操作,还是执行除操作。
我们看一组数据:
5 5 2 20
x=5 k=5 能整除 但是我们发现整除一次用20秒。所以我们执行减一操作。
那么在这个过程,我们就必须判断是执行除操作好,还是减操作好了。具体见代码:

#include"stdio.h"
#include"string.h"
#include"algorithm"
   using namespace std;
typedef long long ll;
int main()
{
    ll x,k,A,B;
    while(~scanf("%lld%lld%lld%lld",&x,&k,&A,&B))
    {
        ll sum=0;
        if(k==1)
        {
            ll minx=x*A-A;
            printf("%lld\n",minx);
        }
        else
        {
            while(x!=1)
            {
                if(x%k==0)
                {
                    sum+=min(B,(x-x/k)*A)   ;
                    x=x/k;
                }
                else
                {
                    sum+=x%k*A;
                    x=x-x%k;
                    if(x==0)//如果x==0了的话,证明减过头了。
                    {
                        x++;
                        sum-=A;
                    }
                }
            }
          printf("%lld\n",sum);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值