• 【数据结构算法】小结


    已经一周没有更新我的博客了,今天浅浅的更新一下啊!

    目录

    1.寂寞如雪

    题目分析:

    代码实现:

    2.[NOIP1999]回文数

    题目分析:

    代码实现:

    3.高精度乘法 

    解法分析:

    代码实现:


    1.寂寞如雪

    题目分析:

    这题的难点在于什么呢?

    难在于求截取的一段 “寂寞” 是 它的最大的回复能量;

    而这个难点牵扯到了简单的动态规划问题;动态规划我会在下一个博客写出来;

    先来分析一下思路:

    1.首先就是一个截取的问题;怎么截取可以使得获得的能量最大;这里设计到一个动态规划中的转移思想;

    2.转移等下再说;先来分析一下如何对数据进行处理,准备一个数组,将 每一段 1 的个数 存起来;例如 :111001110001111; 数组中这样存:3 0 3 0 4 ;再对这个数组进行平方处理,偶数位赋予负值;为了方便偶数维赋予赋值 可以 在数组开头加上一个零 像这样: 0 9 0 9 0 16;这时只需要 当 i % 4 == 3 的时候乘于-1;

    3.这一步就是动态规划的了;求连续区间的最大值问题;

    代码实现:

    1. #include
    2. #define maxn 1000010
    3. #define ll long long
    4. int min(int x, int y)
    5. {
    6. return x > y ? y : x;
    7. }
    8. int max(int x, int y)
    9. {
    10. return x > y ? x : y;
    11. }
    12. int main()
    13. {
    14. ll a[maxn], sum, tot, diff, ans = 0;
    15. char ch[maxn];
    16. scanf("%s", ch + 1);
    17. ll len = strlen(ch + 1);
    18. tot = ch[1] - '0';
    19. a[tot] = tot;
    20. //利用循环 将 1 和 0 的个数 分开
    21. for (int i = 2; i <= len; i++)
    22. {
    23. if (ch[i] == ch[i - 1])
    24. a[tot] += ch[i] - '0';
    25. else
    26. a[++tot] = ch[i] - '0';
    27. }
    28. // 平方
    29. for (int i = 1; i <= tot; i++)
    30. {
    31. a[i] = a[i] * a[i];
    32. }
    33. diff = sum = 0;
    34. // 偶数位取负
    35. for (int i = 3; i <= len; i += 4)
    36. {
    37. a[i] = -a[i];
    38. }
    39. for (int i = 1; i <= len; i++)
    40. {
    41. if (i % 4 == 1)
    42. diff = min(sum, diff);
    43. sum += a[i];
    44. ans = max(sum - diff, ans);
    45. }
    46. //11010111011111
    47. // 让奇数位再取负
    48. for (int i = 1; i <= len; i++)
    49. {
    50. a[i] = -a[i];
    51. }
    52. diff = sum = 0;
    53. for (int i = 3; i <= len; i++)
    54. {
    55. if (i % 4 == 3)
    56. diff = min(sum, diff);
    57. sum += a[i];
    58. ans = max(sum - diff, ans);
    59. }
    60. printf("%lld\n", ans);
    61. return 0;
    62. }

    2.[NOIP1999]回文数

    题目分析:

    1.这一题掺杂了进制的问题 首先它输入的数字的进制 就不一定是 10进制的;我们要把输入的数值当初字符串储存起来;

    2.再准备两个数组,一个数组用来将输入的字符串转化位数值;另一个数组是储存数值的数位相加的结果;

    3.对数位相加的数组进行进位处理,之后判断回文;循环就行了;

    代码实现:

    1. #include
    2. int fun(int b[], int len, int N, int flag)
    3. {
    4. flag++;
    5. int i = 0;
    6. int c[10020] = {0};
    7. for(i=0; i
    8. {
    9. c[i] = b[i]+b[len-1-i];
    10. }
    11. for(i=0; i
    12. {
    13. if(c[i]>=N)
    14. {
    15. c[i+1] = c[i+1]+c[i]/N;
    16. c[i] = c[i]%N;
    17. }
    18. if(c[len])
    19. len++;
    20. }
    21. if(flag<=30)
    22. {
    23. for(i=0; i2; i++)
    24. {
    25. if(c[i]!=c[len-i-1])
    26. return fun(c,len,N,flag);
    27. }
    28. }
    29. return flag;
    30. }
    31. int main()
    32. {
    33. int N = 0;
    34. char a[105] = {0};
    35. int b[105] = {0};
    36. int flag = 0;
    37. int i = 0;
    38. scanf("%d", &N);
    39. scanf("%s", a);
    40. int len = strlen(a);
    41. for(i=0; i
    42. {
    43. if((int)a[i]>58)
    44. b[i] = (int)a[i]-55;
    45. else
    46. b[i] = (int)a[i]-48;
    47. }
    48. int res=fun(b, len, N, flag);
    49. if(res<=30)
    50. printf("STEP=%d\n", res);
    51. else
    52. printf("Impossible!");
    53. return 0;
    54. }

    3.高精度乘法 

    解法分析:

    1.众所周知,乘法的运算相信大家都会;

     2.我们的目的就是将这一过程用编程语言来实现;首先我们要倒置输入的数值;利用双层循环对数位进行相乘相加;然后进行进制数位的处理;

    代码实现:

    1. #include
    2. void revease(char a[], int len)
    3. {
    4. int i = 0;
    5. int x = len;
    6. for (i = 0; i < x / 2; i++)
    7. {
    8. char tmp = a[i];
    9. a[i] = a[len - 1];
    10. a[len - 1] = tmp;
    11. len--;
    12. }
    13. }
    14. int main()
    15. {
    16. int T = 0;
    17. scanf("%d", &T);
    18. while (T--)
    19. {
    20. char a[51] = { '0' };
    21. char b[51] = { '0' };
    22. scanf("%s%s", a, b);
    23. int len1 = strlen(a);
    24. int len2 = strlen(b);
    25. revease(a, len1);
    26. revease(b, len2);
    27. int nums[1000] = { 0 };
    28. int i = 0;
    29. int j = 0;
    30. for (i = 0; i < len1; i++)
    31. {
    32. for (j = 0; j < len2; j++)
    33. {
    34. nums[i + j] = nums[i + j]+(a[i] - '0') * (b[j] - '0');
    35. }
    36. }
    37. for (i = 0; i < 1000; i++)
    38. {
    39. if (nums[i] >= 10)
    40. {
    41. int tmp = nums[i] / 10;
    42. nums[i] = nums[i] % 10;
    43. while(tmp--)
    44. nums[i + 1]++;
    45. }
    46. }
    47. int tmp = len1;
    48. for (j = 0; j < tmp + len2 - 1 ; j++)
    49. {
    50. printf("%d",nums[len1 + len2 -2]);
    51. len1--;
    52. }
    53. printf("\n");
    54. }
    55. return 0;
    56. }

  • 相关阅读:
    VoLTE端到端业务详解 | VoLTE用户注册流程
    SpringCloud的新闻资讯项目04 --- 自媒体文章-自动审核
    小巧时尚的机械键盘,通吃五台设备,雷柏MT510PRO键盘体验
    (一)学习spring-cloud2021之spring-authorization-server
    TBWeb开发版V3.2.6免授权无后门Chatgpt系统源码下载及详细安装教程
    信安软考——第六章 认证技术原理和应用 笔记记录
    大数据必学Java基础(四十八):包装类和日期类的讲解
    C++中的多态
    2022年6月 电子学会青少年软件编程 中小学生Python编程 等级考试一级真题答案解析(判断题)
    管道的介绍
  • 原文地址:https://blog.csdn.net/weixin_57560405/article/details/126472546