专栏文章

CF2132C1 The Cunning Seller (easy version)

CF2132C1题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio68w18
此快照首次捕获于
2025/12/02 14:02
3 个月前
此快照最后确认于
2025/12/02 14:02
3 个月前
查看原文

题目传送门

思路

题目大意

你需要买 nn 个西瓜,每次可以买 3x3^x 个西瓜(13xn1 \le 3^x \le n),需要花费 3x+1+x×3x13^{x+1} + x \times 3^{x-1} 个硬币,问在交易次数最少的前提下的最少花费是多少。

做法

由于是在交易次数最少的前提下,所以购买的方式也是唯一的。于是我们可以将 nn 转化成三进制数,对于第 ii 位的数字 jj,需要 j×(3x+1+x×3x1)j \times (3^{x+1} + x \times 3^{x-1}) 的花费。
tips:可以预处理 33 的幂。

AC Code:

CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=30+5;
ll t[N]; //t[i]表示3的i次方 
void solve()
{
	int n;
	cin >>n;
	ll ans=0;
	for(int i=18;i>=0;i--)
	{
		if(n>=t[i])
		{
			ll tmp=n/t[i]; 
			n-=(tmp*t[i]);
			ans=ans+(t[i+1] + i*t[i-1])*tmp; //*tmp 表示需要重复多少次这样的交易 
		}
	}
	cout <<ans<<'\n';
}
int main()
{
	t[0]=1;
	for(int i=1;i<=20;i++) t[i]=t[i-1]*3; //预处理3的i次方 
	int t;
	cin >>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...