题目描述:
这里有一个数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);
}
}
}