PTA A1100 Mars Numbers 解题思路

本文探讨了如何使用13进制进行数字与字符串的转换,特别关注将169及以下数字转换为13进制的问题。文章建议预先计算00到1212的13进制字符串,以便快速查找。介绍了实现这一目标所需的映射方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心要点

题目的意思很明确,以13为进制,进行数字和字符串之间的转换,并且题目也不是美容道理的没有上限,而是说明了,最大的数是169,即13的平方。
那么就可以这么思考:
169的13进制,相当于100,题目以此为边界,说明:
可以直接把0 0到12 12对应的字符串都先计算出来,然后对照查表即可。

需要用到的工具

两种映射:
数字 -> 字符串;
字符串 -> 数字;
分别用string和map即可。

### 关于PTA C++ 题目“势均力敌”的解题思路 在解决PTA上的C++编程题目时,“势均力敌”通常涉及平衡两个集合中的元素数量或数值总和等问题。这类问题的核心在于如何通过算法实现最优分配,使得两方尽可能接近某种均衡状态。 #### 1. **问题分析** 假设该题目要求将一组整数分为两部分,使这两部分的和最接近。可以采用动态规划的方法来求解此问题。具体来说,可以通过计算子集和的方式找到一个最佳分割方案[^1]。 对于给定的一组数字`nums[]`,目标是最小化|sum(A)-sum(B)|,其中A和B分别是原数组的一个划分,并满足条件: \[ \text{minimize} |S_A - S_B|, \quad S_A + S_B = T \] 这里T表示整个数组元素之和,则有\( S_B = T-S_A\) ,因此优化目标变为最小化 \( |2*S_A-T|\)。 #### 2. **解决方案** 以下是基于上述逻辑的一种可能实现方式: ```cpp #include <iostream> #include <vector> using namespace std; bool dp[1000][5000]; // 假设最大长度为1000,最大值范围为[-5000,5000] int main(){ int n; cin >> n; vector<int> nums(n); long long total_sum = 0; for(auto &num : nums){ cin>> num; total_sum += abs(num); } memset(dp,false,sizeof(dp)); dp[0][total_sum]=true; for(int i=1;i<=n;i++){ for(int s=-total_sum;s<=total_sum;s++) { if(s-nums[i-1]+total_sum >=0 && dp[i-1][s-nums[i-1]+total_sum]){ dp[i][s+total_sum]=true; } if(s+nums[i-1]+total_sum <=2*total_sum && dp[i-1][s+nums[i-1]+total_sum]){ dp[i][s+total_sum]=true; } } } int min_diff = INT32_MAX; for (int s = -total_sum; s <= total_sum; ++s) { if (dp[n][s + total_sum]) { min_diff = min(min_diff, abs(s)); } } cout << min_diff; } ``` 这段代码利用了一个二维布尔型DP表记录每一步的状态转移情况,最终输出的是能够达到的最小差值绝对值。 #### 3. **复杂度讨论** 时间复杂度主要取决于输入规模以及允许的最大偏差范围,在本例中大约为O(N×Sum),空间上同样消耗较大,需注意内存限制[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值