【发布时间】:2021-04-02 23:10:52
【问题描述】:
问题来了: 哈娜是一个数学制造者。最初,他有一个数字 n。每次他执行一个动作,他都会移除任何元素x,使得x > 1,然后在相同的位置插入3个数字,依次为:floor(x/2), x mod 2, floor(x/2)。他必须继续这个操作,直到他收到满是 0 和 1 的列表。
鉴于此,列表是 1 索引的(列表的第一个索引是 1)。实现一个函数 sumOfOnes 计算列表中 l 到 r 范围内数字 1 的个数之和。
注意:
-
时间限制为 2 秒
-
0
-
0
-
r >= l
-
l >= 1
我使用bottom_up方法(动态规划)来解决这个问题int limit time。这是我的代码:
string hana(long long int n)
{
string* memoize = new string[n+1];
memoize[0] = "0";
memoize[1] = "1";
for(long long int i = 2; i <= n; ++i)
{
if(i%2 == 0) memoize[i] = memoize[i/2] + "0" + memoize[i/2];
else memoize[i] = memoize[i/2] + "1" + memoize[i/2];
}
return memoize[n];
}
//
long long int sumOfOnes (long long int n, long long int l, long long int r){
string result = hana(n);
long long int ans = 0;
for(long long int i = l - 1; i <= r - 1; ++i)
{
if(result[i] == '1') ++ans;
}
return ans;
}
它适用于小输入,但由于内存不足,它不适用于大输入! 我真的需要一些关于如何处理大量输入的建议。 非常感谢!!!
【问题讨论】:
-
这可能是来自那些在线编码网站之一的问题。这些网站的问题旨在提供适用于小数据的幼稚解决方案,但不适用于大数据。这个问题的真正解决方案很可能不需要您尝试分配 TB 的内存。当您看到
n到2^50之类的约束时,这完全是一个问题,即解决方案需要某种数学技巧。
标签: c++ dynamic large-data