[关闭]
@Jayfeather 2018-06-24T14:16:30.000000Z 字数 3099 阅读 1016

本周习题汇总

算法题


明明的随机数
链接:https://www.luogu.org/problem/show?pid=P1059

  1. // luogu-judger-enable-o2
  2. #include<stdio.h>
  3. void mergearry(int A[], int left, int right, int mid, int *p)
  4. {
  5. int i = left, j = mid + 1, counter = 0, m = mid, n = right, *temp = p;
  6. while (j <= right && i <= mid)
  7. {
  8. if (A[i] <= A[j])
  9. {
  10. p[counter] = A[i];
  11. i++;
  12. }
  13. else if (A[i] > A[j])
  14. {
  15. p[counter] = A[j];
  16. j++;
  17. }
  18. counter++;
  19. }
  20. while (i <= mid)
  21. {
  22. temp[counter++] = A[i++];
  23. }
  24. while (j <= right)
  25. {
  26. temp[counter++] = A[j++];
  27. }
  28. for (int n = 0; n < counter; n++)
  29. {
  30. A[left + n] = p[n];
  31. }
  32. }
  33. void merge(int A[], int left, int right, int *p)
  34. {
  35. int mid = (right + left) / 2;
  36. if ((right) == left)
  37. return;
  38. else
  39. {
  40. merge(A, left, mid, p);
  41. merge(A, mid + 1, right, p);
  42. mergearry(A, left, right, mid, p);
  43. }
  44. }
  45. void MergeSort(int A[], int num)
  46. {
  47. int *p = new int[num];
  48. merge(A, 0, num - 1, p);
  49. delete[] p;
  50. }
  51. int main()
  52. {
  53. int num;
  54. scanf("%d", &num);
  55. int A[100005] = { 0 };
  56. int left = 0, right = num;
  57. for (int n = 0; n < num; n++)
  58. {
  59. scanf("%d", &A[n]);
  60. }
  61. MergeSort(A, num);
  62. int a=0,b=1,c=1;
  63. while(b<num)
  64. {
  65. if(A[a]!=A[b])
  66. c++;
  67. a++;
  68. b++;
  69. }
  70. a=0;b=0;
  71. printf("%d\n",c);
  72. printf("%d", A[0]);
  73. for (int n = 1; n < num; n++)
  74. {
  75. if(A[n-1]!=A[n])
  76. printf(" %d", A[n]);
  77. }
  78. return 0;
  79. }

可以说是对之前的排序算法的一个复习
只是添加了一个统计和去重的内容
总体来说只要排序掌握好了不难


集合运算
链接:https://www.luogu.org/problemnew/show/T33632#sub

  1. #include<stdio.h>
  2. void mergearry(int A[], int left, int right, int mid, int *p)
  3. {
  4. int i = left, j = mid + 1, counter = 0, m = mid, n = right, *temp = p;
  5. while (j <= right && i <= mid)
  6. {
  7. if (A[i] <= A[j])
  8. {
  9. p[counter] = A[i];
  10. i++;
  11. }
  12. else if (A[i] > A[j])
  13. {
  14. p[counter] = A[j];
  15. j++;
  16. }
  17. counter++;
  18. }
  19. while (i <= mid)
  20. {
  21. temp[counter++] = A[i++];
  22. }
  23. while (j <= right)
  24. {
  25. temp[counter++] = A[j++];
  26. }
  27. for (int n = 0; n < counter; n++)
  28. {
  29. A[left + n] = p[n];
  30. }
  31. }
  32. void merge(int A[], int left, int right, int *p)
  33. {
  34. int mid = (right + left) / 2;
  35. if ((right) == left)
  36. return;
  37. else
  38. {
  39. merge(A, left, mid, p);
  40. merge(A, mid + 1, right, p);
  41. mergearry(A, left, right, mid, p);
  42. }
  43. }
  44. void MergeSort(int A[], int num)
  45. {
  46. int *p = new int[num];
  47. merge(A, 0, num - 1, p);
  48. //delete[] p;
  49. }
  50. int main()
  51. {
  52. int A[1000], B[1000], num1, num2, n1=0,n2=0,counter=0;
  53. scanf("%d", &num1);
  54. for (int n = 0; n < num1; n++)
  55. {
  56. scanf("%d", &A[n]);
  57. }
  58. scanf("%d", &num2);
  59. for (int n = 0; n < num2; n++)
  60. {
  61. scanf("%d", &B[n]);
  62. }
  63. MergeSort(A, num1);
  64. MergeSort(B, num2);
  65. while (n1 < num1 || n2 < num2)
  66. {
  67. if (n1 < num1&&n2 < num2)
  68. {
  69. if (A[n1] < B[n2])
  70. {
  71. n1++;
  72. }
  73. else if (A[n1] > B[n2])
  74. {
  75. n2++;
  76. }
  77. else if (A[n1] == B[n2])
  78. {
  79. printf("%d ", A[n1]);
  80. n1++;
  81. n2++;
  82. counter++;
  83. }
  84. }
  85. else if (n1 >= num1)
  86. {
  87. n2++;
  88. }
  89. else if (n2 >= num2)
  90. {
  91. n1++;
  92. }
  93. }
  94. if(counter!=0)
  95. putchar('\n');
  96. n1 = 0; n2 = 0;
  97. while (n1 < num1 || n2 < num2)
  98. {
  99. if (n1 < num1&&n2 < num2)
  100. {
  101. if (A[n1] < B[n2])
  102. {
  103. printf("%d ", A[n1]);
  104. n1++;
  105. }
  106. else if (A[n1] > B[n2])
  107. {
  108. printf("%d ", B[n2]);
  109. n2++;
  110. }
  111. else if (A[n1] == B[n2])
  112. {
  113. printf("%d ", A[n1]);
  114. n1++;
  115. n2++;
  116. }
  117. }
  118. else if (n1 >= num1)
  119. {
  120. printf("%d ", B[n2]);
  121. n2++;
  122. }
  123. else if (n2 >= num2)
  124. {
  125. printf("%d ", A[n1]);
  126. n1++;
  127. }
  128. }
  129. n1 = 0; n2 = 0;
  130. putchar('\n');
  131. while (n1 < num1 || n2 < num2)
  132. {
  133. if (n1 < num1&&n2 < num2)
  134. {
  135. if (A[n1] < B[n2])
  136. {
  137. printf("%d ", A[n1]);
  138. n1++;
  139. }
  140. else if (A[n1] > B[n2])
  141. {
  142. n2++;
  143. }
  144. else if (A[n1] == B[n2])
  145. {
  146. n1++;
  147. n2++;
  148. }
  149. }
  150. else if (n1 >= num1)
  151. {
  152. n2++;
  153. }
  154. else if (n2 >= num2)
  155. {
  156. printf("%d ", A[n1]);
  157. n1++;
  158. }
  159. }
  160. return 0;
  161. }

小测题目之一
(可以看出来我的排序用的和上面的是一样的……)
(稍微有些偷懒,不过问题不大~)
(能AC就行)


查找元音
链接:https://www.luogu.org/problemnew/show/T32601#sub

  1. // luogu-judger-enable-o2
  2. #include<stdio.h>
  3. int main()
  4. {
  5. char chars[100000000];
  6. int n = -1, x = 0;
  7. scanf("%s", chars);
  8. while (chars[x] != '\0')
  9. {
  10. if (chars[x] == 'a' || chars[x] == 'e' || chars[x] == 'i' || chars[x] == 'o' || chars[x] == 'u' ||
  11. chars[x] == 'A' || chars[x] == 'E' || chars[x] == 'I' || chars[x] == 'O' || chars[x] == 'U')
  12. {
  13. printf("%d", x + 1);
  14. n++;
  15. break;
  16. }
  17. x++;
  18. }
  19. if (n == -1)
  20. printf("0");
  21. return 0;
  22. }

很简单的签到题……不赘述了……

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注