2023华为od机试C卷【推荐多样性】C语言 实现

目录

题目

思路

Code


题目

推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略
1.各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一元素,再从第二个列表中为每屏选择一个元素,依次类推

2.每个列表的元素尽量均分为N份,如果不够N个,也要全部分配完,比如下面的例子:

(1)从第一个列表中选择4条0 12 3,分别放到4个窗口中
(2)从第二个列表中选择4条10 11 12 13,分别放到4个窗口中
(3)从第三个列表中选择4条20 21 22 23,分别放到4个窗口
(4)再从第一个列表中选择4条4 5 6 7,分别放到4个窗口中
(5)再从第一个列表中选择,由于数量不足4条,取剩下的2条,放到窗1和窗口2(6)再从第二个列表中选择,由于数量不足4条并且总的元素数达到窗口要求,取18 19放到窗口3和窗口4


输入描述
第一行输入为N,表示需要输出的窗口数量,取值范围[1,10]

第二行输入为K,表示每个窗口需要的元素数量Q,取值范用[1,100]之后的行数不定(行数取值范围[1,10],表示每个列表输出的元素列表。元素之间以空格分隔,已经过准序外理,每人列表输出的元素数量取值范围[1,100]

输出描述

输出元素列表,元素数量=窗口数量“窗口大小,元素之间以空格分隔,多个窗口合并为一个列表输出,参考样例:先输出窗口1的元素列表,再输出窗口2的元素列表,再输出窗口3的元素列表,最后输出窗口4的元素列表


示例1
输入

4
7
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
输出

0 10 20 4 14 24 8 1 11 21 5 15 25 9 2 12 22 6 16 26 18 3 13 23 7 17 27 19
说明:

1.每个列表会保证元素数最满足窗口要求,不需要考虑元素不足情况
2.每个列表的元素已去重,不需要考虑元素重复情况
3.每个列表的元素列表均不为空,不需要考虑列表为空情况
4.每个列表的元素列表已经过排序处理,输出结果要保证不改变同一个列表的元素顺序
5.每个列表的元素数量可能是不同的
 

思路

1:题目很长,耐心读完的话会发现其实是个简单的题目。

2:我们只要按照题目中给的示例分析来模拟整个过程即可(已加粗)。很多时候,题目的描述很长很臭,但是核心思路往往就在题目给的例子的描述里,大家要注意判断。

Code

#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 cmp(const void *a,const void *b)
{
    int *ap = (int *)a;       
    int *bp = (int *)b;
 
    if(bp[0] == ap[0]){
        return ap[1]>bp[1];
    } else {
        return ap[0]>bp[0];
    }
} 
//qsort(a, n, sizeof(a[0]), cmp);
 
 
int main() {
    char input1[200];
    fgets(input1, 200, stdin);
    char input2[200];
    fgets(input2, 200, stdin);
    int n= atoi(input1);
    int m= atoi(input2);
    int input_matrix[10][100];
    int input_length[10];
    int count = 0;
    
    char input[2000];
    while (fgets(input, 200, stdin)) {
        if(strlen(input) == 0){
            break;
        } else {
            char* token = strtok(input, " ");
            int nums[1000];
            int length = 0;
            while (token != NULL) {
                nums[length++] = atoi(token);
                token = strtok(NULL, " ");
            }
            input_length[count] = length;
            for(int i=0;i<length;i++){
                input_matrix[count][i] = nums[i];
            }
            count+=1;
        }
        
    }
    
    int output_length[count];
    for (int i = 0; i < count; i++) {
        output_length[i] = 0;
    }
    int nums[100000];
    int total=0;
    while (true) {
        if(total >= n * m){
            break;
        } else {
            for (int i = 0; i < count; i++) {
                int index = input_length[i];
                if(input_length[i] > output_length[i] + 4){
                    index = output_length[i] + 4;
                }
                for (int j = output_length[i]; j < index; j++) {
                    nums[total++] = input_matrix[i][j];
                }
                output_length[i] = index;
            }
        }
        
    }

    for (int j = 0; j < n; j++) {
        for (int i = 0; i < m; i++) {
            printf("%d ", nums[i * n + j]);
        }
    }
    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】