比赛 |
防止浮躁的小练习v0.3 |
评测结果 |
WWWWWWWTTW |
题目名称 |
表达式 |
最终得分 |
0 |
用户昵称 |
Rapiz |
运行时间 |
5.960 s |
代码语言 |
C++ |
内存使用 |
0.25 MiB |
提交时间 |
2016-10-12 21:24:03 |
显示代码纯文本
#include<cstdio>
#include<map>
#include<queue>
#include<algorithm>
#define file(x) "expressb."#x
//#define PRODUCE
using std::map;
using std::queue;
using std::min;
using std::max;
int n,k;
map<int,int> s;
struct NODE{int a,stp;
NODE(int x,int y):a(x),stp(y){
};
};
int gsum(int a){
int ret=0;
while(a) ret+=a%10,a/=10;
return ret;
}
int gmx(int a){
int ret=0;
while(a) ret=max(ret,a%10),a/=10;
return ret;
}
int gmn(int a){
int ret=1<<30;
while(a) ret=min(ret,a%10),a/=10;
return ret;
}
int op(int a,int b){
return gsum(a)*gmx(b)+gmn(b);
}
void show(int ls,int it,int stp){
#ifdef PRODUCE
printf("%d # %d = %d * %d + %d = %d (%d)\n",ls,it,gsum(ls),gmx(it),gmn(it),op(ls,it),stp);
#endif
}
typedef map<int,int>::iterator IT;
int solve(){
scanf("%d%d",&n,&k);
s.clear();
s[n]=0;
queue<NODE> q;
NODE u(n,0);
q.push(u);
while(!q.empty()){
NODE un=q.front();q.pop();
int u=un.a,stp=un.stp;
IT it;
for(it=s.begin();it!=s.end();it++) {
int t=op(u,it->first);
if(!s.count(t)) s[t]=stp+it->second+1,q.push(NODE(t,stp+it->second+1)),show(u,it->first,stp+it->second+1);
else s[t]=min(s[t],stp+it->second+1);
t=op(it->first,u);
if(!s.count(t)) s[t]=stp+it->second+1,q.push(NODE(t,stp+it->second+1)),show(it->first,u,stp+it->second+1);
else s[t]=min(s[t],stp+it->second+1);
}
}
if(s.count(k)) return s[k];
else return -1;
}
int main(){
freopen(file(in),"r",stdin);
freopen(file(out),"w",stdout);
int T;scanf("%d",&T);
while(T--) printf("%d\n",solve());
}