codeforces 940 B - Our Tanya is Crying Out Loud (数学,思维)

题目链接 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值