runtime error: index -1 out of bounds for type ‘long long [1000]‘ (solution.cpp)

博主分享了在LeetCode第279场周赛中遇到的问题,关于数组求和可能导致的时间超限。代码中未处理数组元素为0的情况导致错误,博主通过添加判断和修改条件解决了这个问题。讨论了在初始化和sum计算时针对0值的处理策略。

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

这是LeetCode第279场周赛遇到的问题运行错误
在这里插入图片描述
起初不知道为啥会时间超限,我以为是数组开小了,然后我把数组开到10万,想着应该可以了,但是结果还是同样的错误,看着几乎通过所有的测试样例,我突然想到估计可能也许是我有特殊情况我忘记考虑了,然后我自己去造数据,果不其然,当原代码测试数据为0的时候,出现了如下图的情况
在这里插入图片描述
代码有点丑,勿喷,还没看官方题解

加入判断0的情况:
  • 可以在开始就判断,如果开始就为0,则直接输出0
  • 或者在sum判断那里把>0改成>=0就可以了

在这里插入图片描述

如果可以的话我会把周赛题解更新出来,放到这篇文章的下面,对了,这个题目是第二题

温柔,安静,认真学习,运动,努力,上进,人间值得~
好的,这个问题需要找到一个大于等于给定数 \( n \) 的最小整数,它能够表示为几个互不相同的3的幂之和。这类问题通常可以用贪心算法或动态规划来解决。下面是详细的解释及C++代码实现。 ### 思路分析 我们可以利用二进制的思想来处理这个问题。因为3的不同幂次相当于一个新的“基数”,类似于二进制中的每一位可以是0或1一样,在这里每位可以是0、1或2(代表不存在该项、包含一项或两项)。我们的任务是要构造这样一个数字,它可以由一些特定的位置上放置适当的3的幂构成,并且这些位置上的权重组合后的总和不低于 \( n \)。 #### 具体步骤: 1. **初始化**:我们将从最低有效位开始尝试构建新数。 2. **迭代求解**:逐步增加当前考察的3的幂指数,同时维护一个累加器 `sum` 来记录已经累积到的目标值。 - 每当遇到某个3的幂使新的 `sum + pow(3,i)` 超过了目标值 \( n \),我们就停止进一步增大\( i \),转而回溯调整前面较低的有效位。 3. **确定最终答案**:如果直接按上述规则得到的结果恰好就是我们需要的答案,则直接输出;否则继续往上寻找下一个合适的候选者,直到找到合适的一个为止。 这种方法能有效地避免不必要的重复搜索路径,从而提高了效率。 ### C++ 实现 以下是基于以上思想的具体C++实现: ```cpp #include <bits/stdc++.h> // 使用万能头文件 using namespace std; bool canRepresentAsSumOfPowers(ll target) { bitset<64> bits(target); // 将target转换成二进制形式查看其组成 for (ll p = 0; ; ++p) { ll powerValue = static_cast<ll>(pow(3, p)); if(powerValue > target) break; // Check each position to see whether it matches the pattern of summing up distinct powers of three. if ((powerValue & target)) { continue; } else if (!((target ^ powerValue) >= 0 && !(target % powerValue))) { return false; } } return true; } // Function finds next number greater than or equal to 'n', which is representable as a sum of different powers of three. int findNextNumber(int n) { while(true){ if(canRepresentAsSumOfPowers(n)){ return n; } ++n; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin >> t; while(t--){ int n; cin >> n; cout << findNextNumber(n) << "\n"; } return 0; } ``` 请注意上面提供的`canRepresentAsSumOfPowers()`函数实际上并不完全准确,因为它试图检查每一个可能的状态而不是直接验证是否存在一种有效的分配方案。正确的做法应该是采用自顶向下的递归策略配合记忆化技术或者预计算好所有小于某上限内的合法数值再做查找匹配会更好些。 为了简化起见,下面给出更高效的版本: ```cpp #include <bits/stdc++.h> using namespace std; const int MAXN = 1e5+7; vector<long long> valid_numbers; void precomputeValidNumbers(long long current_sum, int exponent) { if(exponent == 20 || current_sum>=MAXN){ // Assuming that with exponents above 19 we exceed reasonable limits. return ; } valid_numbers.push_back(current_sum); precomputeValidNumbers(current_sum + pow(3,exponent), exponent + 1); precomputeValidNumbers(current_sum, exponent + 1); } int getNextNumber(int n) { auto it = upper_bound(valid_numbers.begin(), valid_numbers.end(), n-1); if(it != valid_numbers.end()){ return *it; } throw runtime_error("No solution found within bounds."); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // Pre-compute all numbers that are sums of unique powers of 3 under certain limit. sort(valid_numbers.begin(),valid_numbers.end()); valid_numbers.erase(unique(valid_numbers.begin(),valid_numbers.end()),valid_numbers.end()); int T; cin >> T; while(T--) { int N; cin >> N; try { cout << getNextNumber(N) << '\n'; } catch(const exception& e){ cerr << "Error occurred: " << e.what(); } } return 0; } ``` 在这个改进版中,我们预先计算好了所有的符合条件的数字存入全局变量`valid_numbers`里边儿。这样做的好处是可以大大加快查询速度而且逻辑也更为清晰明了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值