POJ - 1426 Find The Multiple (BFS+打表)

2 篇文章 0 订阅

先说一下题意吧,我看的时候都看了老长时间才看懂题意…
1、m和n都是10进制

2、m是n的倍数但m只能含1或者0

3、比如第一个样例10是2的5倍

4、可能有好几个,其中之一就能接受(比如第一个样例输出是100也对)

做的时候出了好多毛病,先一直是WA, 然后1–200个样例我遍历了一遍发现了有7个数输出错误,我真的很纳闷为啥唯独这7个数错误,其中6个是9的倍数,一个是123…挺懵逼的。

然后我就看了看其他人的代码。怎么说…好多都是dfs写的,但我做的专题规定就是bfs…(虽然我队长说:“你别看着是啥算法就用啥,最后是不知道啥算法,先做题自己想算法,知道了啥算法再做等于没做。”)

emmm…

好不容易找到了一个bfs的,对比了一下发现我比那个人写的多了点东西,虽然我觉得无关紧要,但是改完之后我那个7个数输出的结果竟然都对了!!!

啊,为什么对啊,好懵呀…思考之后无果果断放弃…于是我交了一下…Memory Limit…
???我知道数据有点大,数据类型用的long long为啥子别人的代码没事??

真的没事吗…我交了一下别人的代码…TLM…hahahaha…

然后陷入僵局了老长时间,看了自己的测试数据好久,然后发现并没有错。于是我就思考怎么解决内存限制问题…直到我发现了…打表。

以前只知道素数用数组打筛子那样的打表,没想到还能这样用…学到了。

先用BFS把符合样例的全打出来,然后直接用表。反正我BFS没写错,因为我打表也对了。哎…

其次说一下我感觉的注意事项:1、数据结构是long long
2、打表的时候最后一个数有个逗号,别忘了去…

#include <iostream>
#include <queue>

using namespace std;

int n = 1;
queue<long long> q;

void bfs(int n)
{
    for(q.push(1); !q.empty(); q.pop())
    {
       long long  m = q.front();
        if(m%n == 0) {
            cout << m <<','  ;
            break;

        }
            q.push(m*10);
            q.push(m*10+1);
    }
}

int main()
{
        while(!q.empty())
            q.pop();
            for(int i = 1; i <= 200; ++i)
                bfs(i);
    return 0;
}

然后把运行结果上面的数复制粘贴到另一个程序的数组上

#include<iostream>
using namespace std;
long long ans[201] = {1,10,111,100,100,1110,1001,10000,
111111111,100000,
100001,101100,101101,
110110,111000,100000,100011,1111111110,1001110,
1010000,1010100,1011010,
1011011,1101000,1101000,1101100,1101111111,1110011000,
1110110111,1110111000,
1111000010,1111100000,1111100001,1111100110,1111101110,
11111111100,11111111100,
10011100,10101000,10101000,10111010,11000010,11011010,
11100100,10111111110,11000000010,11000100101,11001000000,
11001110001,11001110100,11001111111,11011000000,11011000001,
11011111110,11100000010,11100110000,11110001100,11110100100,
11111100011,11111111100,1000101100,1010011000,1111011111,1000000,
1001000,1111110,
100000001110,100001111100,100010000010,100010001000,
100010110100,111111111000,100010000,100011000,100011000,100111000,100111011,
101010000,
101010111,101100000,100111110111,101000101100,101010101110,101011010100,
101011110000,
101101001010,101110010001,101111010000,101111111011,101111111100,
101111111101,110000000100,110000000100,110001001010,110001011100,110010000000,
110011101111,110100011000,111111111111111111,100000000,
100000100,100011000,111000010,111111000,111111000,
100000001000100,100000001101101,100010111111100,
100011101010001,100011101101010,100011101110011,100011110010000,
100011110110010,100011111011010,100011111110100,100100001101100,
100100101111101,100100110000100,100101000100010,100101000111000,
100101001000000,
100101001001010,100110001111011,
100110011110100,100110011111000,100110101110110,100110111010010,
10000000,100111010101101,100100,101001,100111011000000,100111011010101,
100111100110010,100111100111010,100111101100000,100111110110000,
101000001101100,101000011101100,101000100000100,101001001010100,
101001001110110,101001001111010,101011111110000,101111110,110011000,
111100101,111111000,110111,111000,
101100000101010,101100001110000,101100001111011,101100010011000,
101100010110010,101100100101000,101100100110110,101100101100010,
100011000,100100000,101100111,101101001011110,101101001101011,101101011001100,
11011110,101101100000110,101101101110010,101110000110000,101110010010100,
101110010101000,
101110010110101,101110011101000,101110111110111,101111000000100,101111000011000,
101111000100000,
101111010011010,101111111010110,110000010100110,110000111111100,110001000110100,
110001001110000,110001010100001,110001011111000,110001011111100,110001100011000,
110001100011110,110001100100100,110001100110111,110001100111010,110001100111010,
110001111000000,110001111010001,110001111110100,110010000110010,110010010000100,
110010011011101,1111111111111111110,1100010111,1100011000};
int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0)
            break;
        cout<<ans[n-1]<<endl;
    }
    return 0;
}


…写的有点累…俺就是这样子…最后我问了问队长,宽搜能做到内存不限制吗…
在这里插入图片描述
…如果能不爆内存的话可能是我写错了,我不会改…
最后上一张我今天一上午可怜的a题情况:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值