题意:输入一个n,k,A,B,你要把n经过两种操作变成1,一种是操作是每次减1,需要花费A个硬币,如果当前n是K的倍数,n也可以除以k,花费B个硬币。输出最少的花费,让n变成1.
题解:贪心 最开始我是贪心模拟的,如果n是k的倍数,就比较除以k的花费,和n一个一个减1到n/k一样大小的花费,取花费较小的,不是k的倍数,就一个一个减,思路没错,但是会超时,因为不是k的倍数,数据很大的情况下,一个一个减会超时滴,然后就优化嘛,我们需要比较花费的时候是n是k的倍数的时候,所以不是倍数的时候,就不要一个一个减,一次性减到n是k的倍数。n-=n%k。时间复杂度大大降低,第四组数据最开始的模拟要话14秒,然后优化后第四组数据0秒。
#include<bits/stdc++.h> using namespace std; int main() { long long n,k,a,b,ans=0; cin>>n>>k>>a>>b; // double s=clock(); while(n>1) { ans+=n%k*a; n-=n%k; if((n-n/k)*a<b) ans+=(n-1)*a,n=1; else ans+=b,n=n/k; } // double t=clock(); // cout<<(t-s)/1000<<"毫秒"<<endl; cout<<ans<<endl; return 0; }