【2024.2.3练习】X 进制减法

题目描述


题目分析

这是一道阅读题。先分析第一段给出的范例:X进制数x(321),由于个位数逢2进1,十位数逢10进1,故x(321) = 3\times 10\times 2+2\times 2+1 = 65,这样便得到了X进制转十进制数字的算法。

再来看输入格式。第一行限定了X进制的X最大值,第二到五行输入了同一进制规则的两个X进制数AB,要求输出A-B的最小可能结果。

根据数据范围,先排除暴力枚举的可能性。不妨先求出A-B的X进制表示结果,即每一位数对应相减。再分析如何设计X进制可以让结果最小。

由于数据实在太大了,考虑该题是否满足贪心。首先想每位数的进制是否都要取到最小。分类讨论:若AB每一位数对应相减均为正数,显然每位数进制都要取最小;当存在某一位数对应相减为负数,由于题干说明A\geq B,最大位上一定不为负数,若某一位出现负数则+N,并向下一位借1,这样不会影响A-B的值,但最终会将所有位数变成正数,第二种情况就归纳进了第一种情况。综上贪心成立。


我的代码

注意细节,输入是从高位到低位,结果可能很大要取模,用Longlong存储数据。

#include <iostream>
#include <algorithm>
using namespace std;
const int max_n = 1e5+1;
typedef long long ll;
ll A[max_n];
ll B[max_n];
ll N[max_n];
ll min_n = 2;
int main() {
	int n;
	int a;
	int b;
	cin >> n;
	cin >> a;
	for (int i = a; i >= 1; i--)
	{
		cin >> A[i];
	}
	cin >> b;
	for (int i = a; i >= 1; i--)
	{
		if (i <= b) {
			cin >> B[i];
		}
		else
		{
			B[i] = 0;
		}
		N[i] = max(min_n, max(A[i] + 1, B[i] + 1));
	}
	//计算结果
	ll ans = 0;
	ll muti = 1;
	for (int i = 1; i <= a; i++)
	{
		ans = ans + (A[i] - B[i]) * muti;
		ans = ans % 1000000007;
		muti = muti * N[i];
		muti = muti % 1000000007;
	}
	cout << ans;
	return 0;
}
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值