当前位置:   article > 正文

2023华为od机试C卷【CPU算力分配】C语言 实现_华为od机试真题-分配插旗

华为od机试真题-分配插旗

目录

题目

思路

Code


题目

现有两组服务器A和B,每组有多个算力不同的CPU,其中 A[i] 是A组第i个CPU的运算能力,B[i]是 B组 第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。
为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换。
求两组服务器中,用于交换的CPU的算力,并且要求从A组服务器中选出的CPU,算力尽可能小。


输入描述
第一行输入为L1和L2,以空格分隔,L1表示A组服务器中的CPU数量,L2表示B组服务器中的CPU数量.
第二行输入为A组服务器中各个CPU的算力值,以空格分隔。
第三行输入为B组服务器中各个CPU的算力值,以空格分隔。
1 ≤ L1 ≤10000
1 ≤L2 ≤ 10000
1 ≤A[i] ≤100000
1 ≤ B[i]  ≤100000

输出描述
对于每组测试数据,输出两个整数,以空格分隔,依次表示A组选出的CPU算力,B组选出的CPU算力。要求从A组选出的CPU的算力尽可能小。
备注:保证两组服务器的初始总算力不同,答案肯定存在


示例1:

输入:
2 2
1 1
2 2
输出

1 2
说明
从A组中选出算力为1的CPU,与B组中算力为2的进行交换,使两组服务器的算力都等于3.

示例2:

输入:

2 2
1 2
2 3
输出
1 2

示例3:

输入:
1 2
2
1 3
输出
2 3

示例4:

输入:
3 2
1 2 5
2 4

输出:
5 4

思路

1:看着题目描述的很长,但其实逻辑还是比较简单的。我们就是想要通过交换一个数字使得两个数组的和相等

2:第一步,先算出两个数组和差值的一半,这就是我们的目标值。

3:第二步,用这个目标值逐个去排序好的A数组中减去对应的值,查看结果是否在B数组中存在,若存在,则交换两个值即可(输出最后答案)。

Code

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <math.h>
  6. #include <limits.h>
  7. #include <float.h>
  8. #include <regex.h>
  9. #include <ctype.h>
  10. #define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
  11. #define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
  12. #define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )
  13. #define MIN(a, b) ((a) < (b)) ? (a) : (b)
  14. #define MAX(a, b) ((a) > (b)) ? (a) : (b)
  15. int cmpfunc_str (const void * a, const void * b) {
  16. return strcmp(a ,b);
  17. }
  18. int cmpfunc (const void * a, const void * b) {
  19. return ( *(int*)a - *(int*)b );
  20. }
  21. //qsort(dp, m+1, sizeof(int), cmpfunc);
  22. /*
  23. char input[200000];
  24. fgets(input, 200000, stdin);
  25. //逗号分隔
  26. char* token = strtok(input, ",");
  27. int v[1000];
  28. int score1 = 0;
  29. while (token != NULL) {
  30. v[score1++] = atoi(token);
  31. token = strtok(NULL, ",");
  32. }*/
  33. int main() {
  34. //输入
  35. int count1,count2;
  36. scanf("%d %d", &count1, &count2);
  37. int nums1[count1];
  38. int sum1 = 0;
  39. for (int i = 0; i < count1; i++) {
  40. scanf("%d", &nums1[i]);
  41. sum1 += nums1[i];
  42. }
  43. int sum2 = 0;
  44. int nums2[count2];
  45. int num2_map[100000];
  46. for (int i = 0; i < 100000; i++) {
  47. num2_map[i]= 0;
  48. }
  49. for (int i = 0; i < count2; i++) {
  50. scanf("%d", &nums2[i]);
  51. sum2 += nums2[i];
  52. num2_map[nums2[i]]= 1;
  53. }
  54. qsort(nums1, count1, sizeof(int), cmpfunc);
  55. int i=0;
  56. while(true){
  57. if(i>=count1){
  58. break;
  59. } else {
  60. int target = nums1[i] - (int)((sum1-sum2)/2);
  61. if (num2_map[target]==1) {
  62. printf("%d %d", nums1[i] ,target);
  63. break;
  64. }
  65. }
  66. i+=1;
  67. }
  68. return 0;
  69. }

【华为od机试真题Python+JS+Java合集】【超值优惠】:Py/JS/Java合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java】:Java真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群:830285880】

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

闽ICP备14008679号