我正在尝试解决SPOJ 问题“一和零”:
某些正整数的十进制表示仅由 1 和 0 组成,并且至少有一位数字 1,例如 101。如果一个正整数不具有这样的属性,可以尝试将其乘以某个正整数来确定是否产品有这个属性。
我解决这个问题的方法是简单地做 BFS。获取仅包含的字符串'1'
,然后对其进行 BFS,并在每个步骤中添加'1'
and '0'
。直到现在以字符串形式和余数跟踪数字。当余数为零时,该数被找到。
我的问题是:我的代码对于测试用例(例如 9999 或 99999)花费的时间太长。如何提高算法的运行时间?
// Shashank Jain
/*
BFS
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#define LL long long int
using namespace std;
LL n;
string ans;
void bfs()
{
string str,first,second;
str+='1'; // number will start with '1' always
if(n==1)
{
ans=str;
return;
}
queue<pair<string,LL> >q; // pair of STRING(number) and long long int
// (to hold remainder till now)
pair<string,LL>p;
p=make_pair(str,1);
q.push(p);
LL rem,val,temp;
while(q.empty()==0)
{
p=q.front();
q.pop();
str=p.first;
val=p.second;
if(val==0) // remainder is zero means this is number
{
ans=str;
return ;
}
// adding 1 to present number
temp=val*10+1;
rem=(temp)%n;
firstone=str+'1';
p=make_pair(firstone,rem);
q.push(p);
// adding 0 to present number
temp=val*10+0;
rem=(temp)%n;
secondone=str+'0';
p=make_pair(secondone,rem);
q.push(p);
}
}
int main()
{
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
bfs();
for(i=0;i<ans.size();i++)
{
printf("%c",ans[i]);
}
printf("\n");
}
return 0;
}