赞
踩
目录
现有两组服务器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数组中存在,若存在,则交换两个值即可(输出最后答案)。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdbool.h>
- #include <math.h>
- #include <limits.h>
- #include <float.h>
- #include <regex.h>
- #include <ctype.h>
-
- #define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
- #define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
- #define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )
-
- #define MIN(a, b) ((a) < (b)) ? (a) : (b)
- #define MAX(a, b) ((a) > (b)) ? (a) : (b)
-
- int cmpfunc_str (const void * a, const void * b) {
- return strcmp(a ,b);
- }
-
- int cmpfunc (const void * a, const void * b) {
- return ( *(int*)a - *(int*)b );
- }
- //qsort(dp, m+1, sizeof(int), cmpfunc);
-
- /*
- char input[200000];
- fgets(input, 200000, stdin);
-
- //逗号分隔
- char* token = strtok(input, ",");
- int v[1000];
- int score1 = 0;
- while (token != NULL) {
- v[score1++] = atoi(token);
- token = strtok(NULL, ",");
- }*/
-
- int main() {
- //输入
- int count1,count2;
- scanf("%d %d", &count1, &count2);
-
- int nums1[count1];
- int sum1 = 0;
- for (int i = 0; i < count1; i++) {
- scanf("%d", &nums1[i]);
- sum1 += nums1[i];
- }
- int sum2 = 0;
- int nums2[count2];
- int num2_map[100000];
- for (int i = 0; i < 100000; i++) {
- num2_map[i]= 0;
- }
- for (int i = 0; i < count2; i++) {
- scanf("%d", &nums2[i]);
-
- sum2 += nums2[i];
- num2_map[nums2[i]]= 1;
- }
- qsort(nums1, count1, sizeof(int), cmpfunc);
-
- int i=0;
- while(true){
- if(i>=count1){
- break;
- } else {
- int target = nums1[i] - (int)((sum1-sum2)/2);
- if (num2_map[target]==1) {
- printf("%d %d", nums1[i] ,target);
- break;
- }
- }
- i+=1;
- }
-
- return 0;
- }
【华为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】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。