Here是我problem的代码。代码在我的Code :: blocks上正常运行,但在spoj站点和ideone.com上没有运行。我遇到运行时错误。我猜这个spoj服务器无法分配所需的内存量。请提出一些建议。
答案 0 :(得分:5)
您的代码声明了一个空字符串s
,然后分配给它的元素......
...
string s,res;int c=0;
int sum,carry=0;
for(int i=m-1;i>=0;i--)
{
sum=(a[i]-'0')*2+carry;
s[c]=sum%10+'0'; // This is undefined behavior, s is empty
carry=sum/10;
c++;
}
...
答案 1 :(得分:1)
这是您problem的可能答案,而不是您的问题。
我猜这个问题具有算法的味道,其目的是找到 具有最小时间复杂度的解决方案(可能是线性时间解决方案)。 对与最佳时间复杂性相关的问题进行一些预测是有帮助的。
所以我计算了几个时间步骤产生的模式(如下所示):
step pattern no. consecutive zero pairs
1 01 0
2 1001 1
3 01101001 1
4 1001011001101001 3
5 01101001100101101001011001101001 5
6 1001011001101001011010011001011001101001100101101001011001101001 11
7 0110100110010110100101100110100110010110011010010110100110010110 21
1001011001101001011010011001011001101001100101101001011001101001
8 1001011001101001011010011001011001101001100101101001011001101001 43
0110100110010110100101100110100110010110011010010110100110010110
0110100110010110100101100110100110010110011010010110100110010110
1001011001101001011010011001011001101001100101101001011001101001
9 0110100110010110100101100110100110010110011010010110100110010110 85
1001011001101001011010011001011001101001100101101001011001101001
1001011001101001011010011001011001101001100101101001011001101001
0110100110010110100101100110100110010110011010010110100110010110
1001011001101001011010011001011001101001100101101001011001101001
0110100110010110100101100110100110010110011010010110100110010110
0110100110010110100101100110100110010110011010010110100110010110
1001011001101001011010011001011001101001100101101001011001101001
产生上述模式的代码如下:
#include<iostream>
using namespace std;
main()
{
string s,t="";
s="paste pattern produced in a time-step here";
int i,l,n=0;
l=s.length();
cout <<"s.length - "<<l<<endl;
for(i=0;i<l;i++)
{
if(s[i]=='0')
{t+="10";}
else
{t+="01";}
}
l*=2;
for(i=0;i<l-1;i++)
{
if(t[i]=='0' && t[i+1]=='0')
{
n+=1;
}
}
cout <<"t - "<<t<<endl;
cout <<"no. of consecutive zero pairs - "<<n<<endl;
}
下面提到的几个重要观察结果如下:
1)每个时间步长中的字符数是上一步的两倍。
2)在前一个时间步中,为 01 组合生成一对连续的零。
3)任何模式的后半部分都是上半年的 NOT 。
现在是有趣的部分。查看每个步骤生成的连续零对的数量。如果我们分配第一步的结果,则将n表示为零:
对于步骤2,我们得到的结果为n * 2 + 1,其中n为0。
对于步骤3,我们得到的结果为n * 2 - 1,其中n为1。
对于步骤4,我们得到的结果为n * 2 + 1,其中n为1.
对于步骤5,我们得到n * 2 - 1的结果,其中n是3。
或者一般来说我们的结果等于n * 2 - 1(对于奇数时间步长) 和结果等于n * 2 + 1(偶数时间步长)
这不会解决我们的问题,因为n是一个变量,我们需要 找到一个与初始结果相关的数学公式(对于时间步骤1) 并且结果在任何时间 - 步骤说t。
但我们有一条简单的出路。
查看数字0,1,1,3,5,11,21,43,85 ....
这是我们的解决方案。
1)浏览输入数字并找出最大值。这需要花费O(n)时间。
2)创建Jacobsthal数字的查找表(LUT),最多最大。这需要 不超过O(n)时间因为你只需要当前Jacobsthal数的前两个Jacobsthal数。从Jacobsthal数的性质可以看出这一点。
3)再次通过输入数字遍历输出相应的数字 来自LUT的序列号。查表需要O(1)时间和总时间 n个数字将是O(n)。
4)整个问题的时间复杂度为O(n)。
这种方法的一个优点是我们不必处理大字符串。
答案 2 :(得分:0)
这只是@ 6502答案的延伸。
看起来ostringstream非常适合你想要的东西。
ostringstream oss;
string s,res;
int c=0;
int sum,carry=0;
for(int i=m-1;i>=0;i--)
{
sum=(a[i]-'0')*2+carry;
oss << (sum%10) << '0'; //Were you trying to concatenate a '0' as well?
carry=sum/10;
}
s = oss.str();