1. 程式人生 > >OJ7826-KKT最少的操作次數

OJ7826-KKT最少的操作次數

#include<iostream>
using namespace std;
int main()
{
	long long a,b,k;
	cin>>a>>b>>k;
	if(k<=1){//特判,k=0或1時,a*k這個操作無效,直接計算b-a就行了
		cout<<b-a;
		return 0;
	}
	long long s=0;
	while(b>a){//倒推
		if(b/k>=a){//如果可除
			if(b%k==0) b/=k,s++;//能整除就儘量除,操作次數+1
			else s+=b%k,b-=b%k;//不能整除則將它變成整除
		}
		else s+=b-a,b=a;//如果不可除,就棄療
	}
	cout<<s;
	return 0;
}

本題採用倒推的思路。正向搜尋顯然會超時(可惜測評機不能+1s啊),所以就採取倒推,每次只推當前最優方案(能乘就乘,不能乘再考慮加)。值得注意的是,k=0時,k不能做除數;k=1時,a*k也無效,所以k<=1時需要特判。

如果看明白了,那就快去試一試吧!