码迷,mamicode.com
首页 > 其他好文 > 详细

判断元素是否存在

时间:2017-10-28 00:28:43      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:print   链接   输入   ret   names   不能   freopen   param   http   

题目链接:http://noi.openjudge.cn/ch0113/41/ 

总时间限制: 1000ms 内存限制: 65536kB
描述

有一个集合M是这样生成的: (1) 已知 k 是集合 M 的元素; (2) 如果 y 是 M 的元素,那么, 2y+1 和 3y+1 都是 M 的元素; (3) 除了上述二种情况外,没有别的数能够成为 M 的一个元素。

问题:任意给定 k 和 x,请判断 x 是否是 M 的元素。这里的 k是无符号整数,x 不大于 100000, 如果是,则输出YES,否则,输出 NO

输入
输入整数 k 和 x, 逗号间隔。
输出
如果是,则输出 YES,否则,输出NO
样例输入
0,22
样例输出
YES

代码一:深搜 

 1 #include<cstdio>
 2 int k,x;
 3 int pd(int k,int x)
 4 {
 5     if(k>x) return 0;
 6     else if(k==x) return 1;
 7         return (pd(2*k+1,x)||pd(3*k+1,x));
 8 }
 9 int main()
10 {
11     scanf("%d,%d",&k,&x);
12     if(pd(k,x)==1) printf("YES");
13     else if(pd(k,x)==0) printf("NO");
14     return 0;
15 }

 

 下面是广搜算法代码,是错的代码:

技术分享
 1 #include <iostream>
 2 #include<stdio.h>
 3 #include<queue>
 4 using namespace std;
 5 int bfs(long long k,int x)
 6 {
 7     long long t1,t2,t3;
 8     if(k==x) return 1;
 9     else if(k>x) return -1;
10 
11     queue<long long> q;
12     q.push(k);
13 
14     while(!q.empty())
15     {
16         //printf("%lld\n",q.front());
17         t1=q.front(); q.pop();
18         t2=t1*2+1;
19         t3=t1*3+1;
20         if(t2==x||t3==x) return 1;
21         else if(t2>x&&t3>x) return -1;
22         else
23         {
24             if(t2<x) q.push(t2);
25             if(t3<x) q.push(t3);
26         }
27     }
28 }
29 int main()
30 {
31     long long k;
32     int x;
33     freopen("r.txt","w",stdout);
34     scanf("%lld,%d",&k,&x);
35     printf("%lld %d\n",k,x);
36     int res=bfs(k,x);
37     if(res==1)printf("YES\n");
38     else printf("NO\n");
39     return 0;
40 }
广搜,不能AC

错误原因:

有可能会发生这样一个情况:比较大的数据先入队,然后超x了结果返回-1。其实后面还有小数据没有被测到。 

 

判断元素是否存在

标签:print   链接   输入   ret   names   不能   freopen   param   http   

原文地址:http://www.cnblogs.com/huashanqingzhu/p/7745662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!