Codeforce940B (Our Tanya is Crying Out Loud)
Right now she actually isn't. But she will be, if you don't solve this problem.
You are given integers n, k, A and B. There is a number x, which is initially equal to n. You are allowed to perform two types of operations:
- Subtract 1 from x. This operation costs you A coins.
- Divide x by k. Can be performed only if x is divisible by k. This operation costs you B coins.
The first line contains a single integer n (1 ≤ n ≤ 2·109).
The second line contains a single integer k (1 ≤ k ≤ 2·109).
The third line contains a single integer A (1 ≤ A ≤ 2·109).
The fourth line contains a single integer B (1 ≤ B ≤ 2·109).
Output a single integer — the minimum amount of coins you have to pay to make x equal to 1.
9
2
3
1
6
5
5
2
20
8
19
3
4
2
12
In the first testcase, the optimal strategy is as follows:
- Subtract 1 from x (9 → 8) paying 3 coins.
- Divide x by 2 (8 → 4) paying 1 coin.
- Divide x by 2 (4 → 2) paying 1 coin.
- Divide x by 2 (2 → 1) paying 1 coin.
The total cost is 6 coins.
In the second test case the optimal strategy is to subtract 1 from x 4 times paying 8 coins in total.
分析:贪心。注意判断k==1的情况。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> using namespace std; int main() { long long N,k,A,B; scanf("%lld%lld%lld%lld",&N,&k,&A,&B); long long ans=0; if(k==1) { printf("%lld\n",A*(N-1)); return 0; } while(N>=k) { if(N%k==0) { long long next=N/k; if((N-next)*A>B) ans+=B; else ans+=(N-next)*A; N=next; } else { long long t=N/k; long long temp=N-t*k; ans+=A*temp; N=t*k; } } if(N!=1)//N<k时 ans+=A*(N-1); printf("%lld\n",ans); return 0; }
作者:ACRykl —— O ever youthful,O ever weeping!
出处:http://www.cnblogs.com/ACRykl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。