• 笔试强训day28(猴子分桃,反转部分单向列表)


    目录

    第一题-猴子分桃

    第二题-反转部分单向列表


    第一题-猴子分桃

    思路:

            假设有n个小猴子,总共有x个桃子,举例,现在n=3,

     由以上推理得,现在有n个猴子,则剩余桃子数量是((4/5)^n*x-(4/5)^n - (4/5)^(n-1)....-4/5)

    我们先单独把s = -(4/5)^n - (4/5)^(n-1)....-4/5)拿出来,

    用错位相减法,得到(4/5)*s = -(4/5)^(n+1) - (4/5)^(n)....-(4/5)(n+1))

    得到(1/5)s = - 4/5 + (4/5)^n-1

    在将剩余桃子数量得第一个((4/5)^n*x部分拿下来,

    得到剩余桃子数量是4^n/5^n * (x+4) - 4,由于桃子剩余数量不可能是分数,又要最小值,

    所以5^n = x + 4

    所以x = 5^n - 4,为总共有多少个桃子

    老猴子最少能得到得桃子数,等于小猴子数量加上最后剩余得桃子数量,

    所以是4^n/5^n * (x+4) - 4+n,将x = 5^n - 4带入其中4^n/5^n * (5^n - 4+4) - 4+n,

    化简为4^n - 4+n

    1. #include
    2. #include
    3. using namespace std;
    4. int main ()
    5. {
    6. int n;//猴子数量
    7. while(cin>>n)
    8. {
    9. if(n == 0)
    10. break;
    11. else
    12. {
    13. long num = pow(5, n) - 4;
    14. long left = pow(4, n) - 4 + n;
    15. cout<" "<
    16. }
    17. }
    18. return 0;
    19. }

    第二题-反转部分单向列表

    思路:

            只要看翻转部分就好,其他都是系统写好了的,为了方便我们定义一个哨兵位,首先找到需要反转的区间,然后利用三个指针将翻转区间翻转,然后首尾连接输出即可,注意翻转时细节,防止next指向空

    1. # include
    2. using namespace std;
    3. struct list_node{
    4. int val;
    5. struct list_node * next;
    6. };
    7. list_node * input_list(void)
    8. {
    9. int n, val;
    10. list_node * phead = new list_node();
    11. list_node * cur_pnode = phead;
    12. scanf("%d", &n);
    13. for (int i = 1; i <= n; ++i) {
    14. scanf("%d", &val);
    15. if (i == 1) {
    16. cur_pnode->val = val;
    17. cur_pnode->next = NULL;
    18. }
    19. else {
    20. list_node * new_pnode = new list_node();
    21. new_pnode->val = val;
    22. new_pnode->next = NULL;
    23. cur_pnode->next = new_pnode;
    24. cur_pnode = new_pnode;
    25. }
    26. }
    27. return phead;
    28. }
    29. list_node * reverse_list(list_node * head, int L, int R)
    30. {
    31. list_node* phead = new list_node;
    32. phead->next = head;
    33. list_node* right = head;
    34. list_node* left = head;
    35. while(--L)
    36. {
    37. right = right->next;
    38. }
    39. while(--R)
    40. {
    41. left = left->next;
    42. }
    43. list_node* cur = right;
    44. list_node* next = cur->next;
    45. list_node* pre = nullptr;
    46. while(pre != left)
    47. {
    48. cur->next = pre;
    49. pre = cur;
    50. cur = next;
    51. if(next)
    52. next = next->next;
    53. }
    54. right->next = cur;
    55. cur = phead;
    56. while(cur->next!=right)
    57. {
    58. cur = cur->next;
    59. }
    60. cur->next = left;
    61. return phead->next;
    62. }
    63. void print_list(list_node * head)
    64. {
    65. while (head != NULL) {
    66. printf("%d ", head->val);
    67. head = head->next;
    68. }
    69. puts("");
    70. }
    71. int main ()
    72. {
    73. int L, R;
    74. list_node * head = input_list();
    75. scanf("%d%d", &L, &R);
    76. list_node * new_head = reverse_list(head, L, R);
    77. print_list(new_head);
    78. return 0;
    79. }

  • 相关阅读:
    linux系统安装步骤
    算法通过村第六关-树青铜笔记|中序后序
    阿里云数据库大全_优惠活动_云数据库排行榜
    代码随想第31天 | 122.买卖股票的最佳时机II 、 55. 跳跃游戏 、 45.跳跃游戏II
    如何写好一份PPT
    Unity3D Shader新手入门教程:3D溶解与腐蚀特效详解
    centos中nacos设置开机自启动
    MQ进阶面试题
    基于人工电场优化的BP神经网络(分类应用) - 附代码
    数据库笔试面试题
  • 原文地址:https://blog.csdn.net/YQ20210216/article/details/127415061