は私がSPOJ problem "Ones and zeros"を解決しようとしています:例えばSPOJ 370 - とゼロ(ONEZERO)
一定の正の整数が彼らの10進表現が唯一のものとゼロから成る持っていると、少なくとも1つの数字1つを有します101.正の整数にこのようなプロパティがない場合は、正の整数で乗算して、このプロパティがあるかどうかを調べることができます。
この問題に対する私のアプローチは、単にBFSを実行することでした。 '1'
のみを含む文字列を取得し、BFSを使用して各ステップで'1'
と'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;
}
@Christian Ammer - 編集ありがとうございました! –
あなたは歓迎します。問題の説明を質問に組み込み、コードをプロバーバ形式にすることは常に良い考えです。 –