zoukankan      html  css  js  c++  java
  • 判断元素是否存在

    题目链接: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
    ",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
    ",k,x);
    36     int res=bfs(k,x);
    37     if(res==1)printf("YES
    ");
    38     else printf("NO
    ");
    39     return 0;
    40 }
    广搜,不能AC

    错误原因:

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

     可以按如下方式修改:

     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
    ",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
    22         {
    23             if(t2<x) q.push(t2);
    24             if(t3<x) q.push(t3);
    25         }
    26     }
    27     return -1;
    28 }
    29 int main()
    30 {
    31     long long k;
    32     int x;
    33 
    34     scanf("%lld,%d",&k,&x);
    35     int res=bfs(k,x);
    36     if(res==1)printf("YES
    ");
    37     else printf("NO
    ");
    38     return 0;
    39 }
  • 相关阅读:
    从针对接口编程到依赖注入
    DataRow 数组转化成DataTable
    Math 类的方法概要
    .net控件
    字符串反转
    DataTable
    Enabled设置为False时,前景色和背景色也不改变的TextBox 并居中
    C# 四舍五入 (解决四舍六入五成双的问题)
    查询最后一条数据
    C# toString()
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/7745662.html
Copyright © 2011-2022 走看看