• 刷题记录(NC202589 魔法数字,NC235247 Sramoc问题)


    NC202589 魔法数字

    题目链接

    关键点:

    1、题目要求求的是最小的步数,因此我们采用bfs,对每一次的n可以转换的步数存下来,然后看是否等于m

    2、如何判断当前数字肯定不行?对于2*m-n为变换数目的上限,因为当当前数为2*m-n,那么再经过m-n次,就变为m,那还不如直接从n一直加一变成m,也为m-n次。所以对于每一步得出的数,我们可以判断当前数是否小于2*m-n,然后再插入队列

    完整代码:

    1. class Solution {
    2. public:
    3. /**
    4. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    5. *
    6. *
    7. * @param n int整型 表示牛牛的数字
    8. * @param m int整型 表示牛妹的数字
    9. * @return int整型
    10. */
    11. int vis[3000];
    12. struct step{
    13. int d, s;
    14. };
    15. queueq;
    16. int solve(int n, int m) {
    17. memset(vis, 0, sizeof(vis));
    18. return bfs(n, m);
    19. }
    20. int bfs(int n, int m)
    21. {
    22. if (n>=m)
    23. return n-m;
    24. q.push({n, 0});
    25. int maxx = 2*m-n;
    26. int ans;
    27. while (!q.empty())
    28. {
    29. step st = q.front();
    30. int x = st.d;
    31. int ste = st.s;
    32. vis[x] = 1;
    33. // cout<<"x = "<
      q.pop();
    34. if (x == m)
    35. {
    36. ans = ste;
    37. return ste;
    38. }
    39. int x1 = x+1;
    40. int x2 = x-1;
    41. int x3 = x*x;
    42. if (x1<=maxx && !vis[x1])
    43. q.push({x1, ste+1});
    44. if (x2<=maxx && !vis[x2])
    45. q.push({x2, ste+1});
    46. if (x3<=maxx && !vis[x3])
    47. q.push({x3, ste+1});
    48. }
    49. return -1;
    50. }
    51. };

    NC235247 Sramoc问题

    题目链接

    关键点:

    1、同样的求最小的步数,采用bfs,对于每一步选则0-k的一个数,组成后插入队列

    2、可以发现对于每次求出的余数,如果出现重复余数,那么该重复余数就不用再继续算下去了,肯定也为重复,因此我们可以用余数是否重复来筛选入队的数

    3、对于组成的数,可能会有很多位,那么采用int来存肯定不行,用字符串来存

    4、对于每个数对于m的取余计算,有以下公式

    (a+b)%m = (a%m+b%m)%m;

    a*b%m = ((a%m)*(b%m))%m;

    那么比如对于

    100011%m = 3

    1000111%m = (3*10+1)%m;

    完整代码:

    1. # include
    2. using namespace std;
    3. int k, m;
    4. int vis[1010];
    5. struct step{
    6. string s;
    7. int yu;
    8. };
    9. queue q;
    10. string bfs()
    11. {
    12. step st;
    13. for (int i=1; i
    14. {
    15. st.s = i+'0';
    16. st.yu = i%m;
    17. vis[i%m] = 1;
    18. q.push(st);
    19. }
    20. while (!q.empty())
    21. {
    22. step tmp = q.front();
    23. q.pop();
    24. if (tmp.yu == 0)
    25. return tmp.s;
    26. for (int i=0; i
    27. {
    28. int y = tmp.yu*10+i;
    29. if (!vis[y%m])
    30. {
    31. step s1 = tmp;
    32. s1.s += i+'0';
    33. s1.yu = y%m;
    34. vis[y%m] = 1;
    35. q.push(s1);
    36. }
    37. }
    38. }
    39. return "-1";
    40. }
    41. int main()
    42. {
    43. cin>>k>>m;
    44. cout<<bfs();
    45. return 0;
    46. }

  • 相关阅读:
    有效的括号(栈的高频面试题)
    【机器翻译】基于术语词典干预的机器翻译挑战赛
    【Python百日进阶-数据分析】Day123 - Plotly Figure参数:饼图(一)
    中国特色AI创业:在OpenAI阴影下的探索与挑战
    基于springboot+vue的网咖网吧管理系统 elementui
    Python自动化测试框架之unittest使用详解
    V神个人调查报告:哪位圈内名人最受V神尊重?中国受V神喜欢吗?
    npm命令--安装依赖包--用法/详解
    c++ noexcept与constexpr解析
    软件代码签名证书怎么申请
  • 原文地址:https://blog.csdn.net/m0_60531106/article/details/126533043