当前位置:   article > 正文

题目二:求指定两个整数数组最小元素和_一个数组元素两边和最小的两个元素和

一个数组元素两边和最小的两个元素和

给定两个整数数组
array1 array2  数组元素按升序排列
 假设从arr1 arr2中分别取出一个元素,可构成一对元素
 现在需要取出k对元素,并对取出的所有元素求和
 计算和的最小值
 注意:两对元素对应arr1 arr2的下标是相同的
       视为同一对元素

输入描述
    输入两行数组arr1 arr2
    每行首个数字为数组大小size   0<size<=100
    arr1,2中的每个元素   0< <1000
    接下来一行  正整数k   0<k<=arr1.size * arr2.size
 输出描述
   满足要求的最小值

例子

输入
   3 1 1 2
   3 1 2 3
   2

输出
   4

说明:用例中需要取两个元素,
 取第一个数组第0个元素与第二个数组第0个元素组成一个元素
 [1,1]
取第一个数组第1个元素与第二个数组第0个元素组成一个元素
 [1,1]

求和为1+1+1+1=4 ,满足要求最小
 

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. int cmp(const void* a, const void* b)
  6. {
  7. return *(int*)a - *(int*)b;
  8. }
  9. void StrToList(char* s, int* list, int* n)
  10. {
  11. int idx = 0;
  12. char* p = strtok(s, " ");
  13. while (p != NULL)
  14. {
  15. p = strtok(NULL, " ");
  16. list[idx] = atoi(p);
  17. idx++;
  18. }
  19. *n = idx - 1;
  20. }
  21. int GetSum(int* arr1, int len1, int* arr2, int len2, int k)
  22. {
  23. int i, j, idx = 0;
  24. int* list = NULL;
  25. int len = sizeof(int) * len1 * len2;
  26. int result = 0;
  27. list = malloc(len);
  28. if (list == NULL)
  29. return -1;
  30. memset(list, 0, len);
  31. for (i = 0; i < len1; i++)
  32. {
  33. for (j = 0; j < len2; j++)
  34. {
  35. list[idx] = arr1[i] + arr2[j];
  36. idx++;
  37. }
  38. }
  39. qsort(list, len1*len2, sizeof(list[0]), cmp);
  40. for (i = 0; i < k; i++)
  41. {
  42. result += list[i];
  43. }
  44. printf("%d", result);
  45. free(list);
  46. }
  47. int main()
  48. {
  49. int k, len1 = 0, len2 = 0;
  50. char s1[100] = { 0 };
  51. char s2[100] = { 0 };
  52. int list1[100] = { 0 };
  53. int list2[100] = { 0 };
  54. gets(s1);
  55. gets(s2);
  56. scanf("%d", &k);
  57. StrToList(s1, list1, &len1);
  58. StrToList(s2, list2, &len2);
  59. GetSum(list1, len1, list2, len2, k);
  60. return 0;
  61. }

附录1:qsort用法
        void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));  

        base待排序数组首地址
        nelem数组中待排序元素数量
        width各元素的占用空间大小
        fcmp指向函数的指针

功能:使用快速排序例程进行排序
时间复杂度:n*log(n)
自定义比较函数int cmp(const void* a, const void *b)

如果a > b比较函数返回大于0;如果a = b,返回0;如果 a < b,返回小于0;

对于整数

  1. int cmp(const void *a, const void *b)
  2. {
  3. return *(int*)a - *(int*)b;
  4. }


对于其他简单类型也可以用相似的方法

举例
 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int cmp(const void *a, const void *b)
  4. {
  5. return *(int *)a - *(int *)b;
  6. }
  7. int main()
  8. {
  9. const int len = 7;
  10. int index;
  11. int arr[len] = { 2, 3, 1, 7, 5, 4, 6 };
  12. printf("Before sort:\n");
  13. for (index = 0; index < len; ++index)
  14. {
  15. printf("%d ", arr[index]);
  16. }
  17. printf("\n");
  18. qsort(arr, len, sizeof(arr[0]), cmp);
  19. printf("After sort:\n");
  20. for (index = 0; index < len; ++index)
  21. {
  22. printf("%d ", arr[index]);
  23. }
  24. printf("\n");
  25. return 0;
  26. }
  27. /*
  28. 输出:
  29. Before sort:
  30. 2 3 1 7 5 4 6
  31. After sort:
  32. 1 2 3 4 5 6 7
  33. */

附录2:strtok(), strtok_s() 字符串分割函数

strtok()在参数_Str的字符串中发现参数_Delim中包涵的分割字符时,则会将该字符改为\0 字符。

在第一次调用时,strtok()必需给予参数_Str字符串,往后的调用则将参数_Str设置成NULL。每次调用成功则返回指向被分割出片段的指针。

需要注意的是,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。

第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量中。

  1. //将字符串"ab,cde,fghi"按照","分割。char str[] = "ab,cde,fghi";
  2. char *p[4];
  3. p[0]= strtok(str, ",");
  4. int i = 0;
  5. while (p[i] != NULL)
  6. {
  7. i++;
  8. p[i]= strtok(NULL, ",");
  9. }
  10. p[i] = "\0";
  11. for (int i = 0; i < 4; i++)
  12. {
  13. cout << p[i] << endl;
  14. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/615582
推荐阅读
相关标签
  

闽ICP备14008679号