题目链接 codeforces 940 B
题意:
给出 n , k , a, b, 每次减一花费 a , 如果n能整除k,可以除k,花费b,问n变为1的最小花费
题解:
当n%k == 0时,如果除k的花费小,那么除以 k,否则直接减到1,退出循环(此时如果除以 k,那么下一步还有可能除 k, 如果不除k,那么下一步必定不可能除 k,因为 n 越变越小,后面除 k,已经保证不了最优【举例,如果8/2你不取的话,那么你一定不可能取4/2,因为8/2一次能减少4,花费b,而4/2一次只能减少2,花费也为b】 )
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){
ll n, k, a, b;
ll ans = 0;
cin >> n >> k >> a >> b;
while(n > 1){
if(k == 1){ // 当k等于1时,除1已经没什么用,直接退出
ans = ans + (n-1)*a;
n = 1;
break;
}
if(n % k == 0 && b <= (n-n/k) * a){ // 当n%k == 0时,且除以k的花费小于减一的花费
ans = ans + b;
n = n / k;
}
else if(n % k == 0){ // n%k==0而没有执行上一步,那么表示除k不能最优,直接退出
ans = ans + (n - 1) * a;
n = 1;
break;
}
else{ // n%k!= 0,将n化为k的倍数
ans = ans + (n % k) * a;
n = n - n % k;
}
}
if(n == 0){
ans = ans - a;
}
cout << ans << endl;
return 0;
}