当前位置:   article > 正文

【华为机试真题 c++、Python实现】3、CPU算力分配_用于交换的cpu的算力python

用于交换的cpu的算力python

刷题


题目描述

现有两组服务器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的算力尽可能小。

备注

保证两组服务器的初始总算力不同。
答案肯定存在

用例

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

提示:以下是本篇文章正文内容,下面案例可供参考

一、题目解析

假设A组服务器算力之和为sumA,B组服务器算力之和为sumB,将A组的a和B组的b交换后,A组算力之和等于B组算力之和,则可得公式如下

sumA - a + b = sumB - b + a

sumA - sumB = 2 * (a - b)

a - b = (sumA - sumB) / 2
其中 sumA, sumB 是已知的,因此,我们可以遍历A组所有元素a,计算出

b= a - (sumA - sumB)/2,看B组中是否存在对应b,若存在,则a b就是题解。

二、算法源码

1. C++算法源码

代码如下(示例):

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <map>
  5. #include <utility>
  6. #include <sstream>
  7. #include <numeric>
  8. #include <unordered_set>
  9. #include <climits>
  10. vector<int> strToVector(string str)
  11. {
  12. string target = " ";
  13. vector<int> res;
  14. string::size_type pos = str.find(target);
  15. while (pos != string::npos)
  16. {
  17. res.push_back(stoi(str.substr(0, pos)));
  18. cout << "1" <<endl;
  19. str.erase(str.begin(), str.begin() + pos + 1);
  20. pos = str.find(target);
  21. cout << "2" <<endl;
  22. }
  23. cout << "3" <<endl;
  24. res.push_back(stoi(str));
  25. cout << "4" <<endl;
  26. return res;
  27. }
  28. vector<int> strToVector1(const string& str)
  29. {
  30. std::istringstream iss(str);
  31. string temp;
  32. char target = ' ';
  33. vector<int> res;
  34. while (getline(iss, temp, target))
  35. {
  36. try
  37. {
  38. res.push_back(stoi(temp));
  39. }
  40. catch(const std::exception& e)
  41. {
  42. std::cerr << e.what() << '\n';
  43. continue;
  44. }
  45. }
  46. return res;
  47. }
  48. vector<int> strToVector3(const string& str)
  49. {
  50. std::istringstream iss(str);
  51. string temp;
  52. vector<int> res;
  53. while (iss >> temp)
  54. {
  55. try
  56. {
  57. res.push_back(stoi(temp));
  58. }
  59. catch(const std::exception& e)
  60. {
  61. std::cerr << e.what() << '\n';
  62. continue;
  63. }
  64. }
  65. return res;
  66. }
  67. int getResult()
  68. {
  69. string str;
  70. getline(cin, str);
  71. cout << str <<endl;
  72. vector<int> arr = strToVector(str);
  73. string strA;
  74. getline(cin, strA);
  75. vector<int> arrA = strToVector1(strA);
  76. int sumA = accumulate(arrA.begin(), arrA.end(), 0);
  77. string strB;
  78. getline(cin, strB);
  79. vector<int> arrB = strToVector1(strB);
  80. unordered_set<int> setB(arrB.begin(),arrB.end());
  81. int sumB = accumulate(arrB.begin(), arrB.end(), 0);
  82. int diff = (sumA - sumB)/2;
  83. int minA = INT_MAX;
  84. string res;
  85. for (auto a : arrA)
  86. {
  87. int b = a - diff;
  88. cout << "b=" << b <<endl;
  89. if (setB.find(b) != setB.end() && a < minA)
  90. {
  91. minA = a;
  92. res = std::to_string(a) + " " + std::to_string(b);
  93. }
  94. }
  95. cout << "result=" << res <<endl;
  96. }
  97. int main()
  98. {
  99. getResult();
  100. return 0;
  101. }

2. Python算法源码

代码如下(示例):

  1. import sys
  2. while True:
  3. try:
  4. l1, l2 = map(int, input().split())
  5. A = list(map(int, input().split()))
  6. B = list(map(int, input().split()))
  7. sumA = sum(A)
  8. sumB = 0
  9. setB = set()
  10. for b in B:
  11. sumB += b
  12. setB.add(b)
  13. # 由于本题必然存在解,因此sumA-sumB的结果肯定可以整除2,如果不能整除则half_diff为小数,
  14. # 而half_diff = a - b,其中a,b都是整数,因此不可能存在half_diff是小数的情况
  15. half_diff = (sumA - sumB) // 2
  16. # 记录用于交换的最小的a
  17. minA = sys.maxsize
  18. # 记录题解
  19. ans = ""
  20. for a in A:
  21. b = a - half_diff
  22. if b in setB:
  23. if a < minA:
  24. minA = a
  25. ans = f"{a} {b}"
  26. print(ans)
  27. except:
  28. break

2. C算法源码

代码如下(示例):

  1. #include <stdio.h>
  2. #include <limits.h>
  3. #include <string.h>
  4. #define MAX_SIZE 10000
  5. #define MAX_VALUE 100000
  6. int main() {
  7. // 可能有多组测试数据
  8. while(1) {
  9. int l1, l2;
  10. int res = scanf("%d %d", &l1, &l2);
  11. if(res != 2) {
  12. break;
  13. }
  14. int A[MAX_SIZE];
  15. int A_size = 0;
  16. int sumA = 0;
  17. while (scanf("%d", &A[A_size])) {
  18. sumA += A[A_size];
  19. A_size++;
  20. if(getchar() != ' ') break;
  21. }
  22. int B[MAX_SIZE];
  23. int B_size = 0;
  24. int sumB = 0;
  25. int setB[MAX_VALUE + 1] = {0};
  26. while (scanf("%d", &B[B_size])) {
  27. sumB += B[B_size];
  28. setB[B[B_size]] = 1;
  29. B_size++;
  30. if(getchar() != ' ') break;
  31. }
  32. // 由于本题必然存在解,因此sumA-sumB的结果肯定可以整除2,如果不能整除则half_diff为小数,
  33. // 而half_diff = a - b,其中a,b都是整数,因此不可能存在half_diff是小数的情况
  34. int half_diff = (sumA - sumB) / 2;
  35. int minA = INT_MAX;
  36. char ans[15];
  37. for(int i=0; i<A_size; i++) {
  38. int a = A[i];
  39. int b = a - half_diff;
  40. if(b > 0 && setB[b] && a < minA) {
  41. minA = a;
  42. char tmp[15];
  43. sprintf(tmp, "%d %d", a, b);
  44. strcpy(ans, tmp);
  45. }
  46. }
  47. puts(ans);
  48. }
  49. return 0;
  50. }

总结

c++算法使用三种分割字符串的方法,第一种当stoi()转换出错时无法处理;第二、三中使用std::istringstream类,需要新加头文件#include <sstream>。

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

闽ICP备14008679号