您的位置:首页 > 其它

UVA136解题报告

2017-05-11 06:48 375 查看
先来份错误代码,亲爱的小伙伴们,希望你们能找到其中的问题,顺便说一句,用的是广搜

#include<cstdio>
#include<queue>
usingnamespacestd;

intmain()
{
queue<longlong>q;
intans=1;
q.push(1);
while(ans!=1500)
{
longlongx=q.front();
q.pop();
q.push(x*2);q.push(x*3);q.push(x*5);
ans++;
}
printf("%d\n",q.front());
return0;
}


上面是我用很短的时间写出来的很漂亮的代码,如果说有什么不完美的地方,那就是他是错的。

有两点决定了他是错的,一,没有从小到大排序,这样实际上并不能确定谁是第1500个丑数,改进方法是用优先队列

二,同一个丑数可以有不同的生成方式,没有现判断该丑数是否已生成是第二个错误,改进方法是加入set判断

AC代码如下time0ms

#include<cstdio>
#include<queue>
#include<set>
#include<vector>
usingnamespacestd;

typedeflonglongLL;
intd[]={2,3,5};

intmain()
{
set<longlong>s;
priority_queue<LL,vector<LL>,greater<LL>>q;
intans=1;
s.insert(1);
q.push(1);
while(ans!=1500)
{
longlongx=q.top();
q.pop();
for(inti=0;i<3;i++)
{
longlongy=x*d[i];
if(!s.count(y)){s.insert(y);q.push(y);}
}
ans++;
}
printf("The1500'thuglynumberis%lld.\n",q.top());
return0;
}
再来份搞笑版的代码,可以AC哦
#include<cstdio>
usingnamespacestd;

intmain()
{
printf("The1500'thuglynumberis859963392.\n");
return0;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: