• 1055. 集体照 (25)


    原题: https://www.patest.cn/contests/pat-b-practise/1055

    思路: 先从大到小排序(名字相同的也考虑上), 然后分排分别遍历, 第一次要遍历
    的人数需要加上剩余的人数, 也就最后一排所有的人数, 之后每排的人数都相等.

    题目中说的先插左边后插右边, 不需要奇偶判断, 用if和elseif就行.

    实现:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LEN 10010
    
    struct Class {
        char name[10];
        int height;
    };
    typedef struct Class class;
    int compare (const void *a, const void *b);
    int main (void) {
        int zrs;        // 总人数
        int zps;        // 总排数
        int gprs;       // 该排人数
        int midpos;     // 中间位置
        class src[LEN]; // 下标0不用
        class dest[LEN];
        int i;
    
        scanf("%d %d", &zrs, &zps);
        for (i = 1; i <= zrs; i++) {
            scanf("%s %d", src[i].name, &src[i].height);
        }
        qsort(src + 1, zrs, sizeof(class), compare);
    
        int startpos = 1; // 开始位置
        int j;
        int left;      // 插入左边
        int right;     // 插入右边
        int leftpos;   // 左位置
        int rightpos;  // 右位置
        for (i = 1; i <= zps; i++) {
            if (i == 1) {
                gprs = (zrs / zps) + (zrs % zps);
            } else {
                gprs = zrs / zps;
            }
            midpos = gprs / 2 + 1;
            dest[midpos] = src[startpos];
            left = 1;
            right = 0;
            leftpos = midpos;
            rightpos = midpos;
            // 每次一段段的循环该排人数
            // 把该排人的位置调整后放入 dest 中
            for (j = startpos + 1; j <= startpos + gprs - 1; j++) {
                if (left == 1) {
                    dest[--leftpos] = src[j];
                    left = 0;
                    right = 1;
                } else if (right == 1) {
                    dest[++rightpos] = src[j];
                    left = 1;
                    right = 0;                
                }
            }
            char ch = ' ';
            for (j = 1; j <= gprs; j++) {
                if (j == gprs) ch = '
    ';
                printf("%s%c", dest[j].name, ch);
            }
            startpos += gprs;
        }
    
        return 0;
    }
    
    int compare (const void *a, const void *b) {
        class arg1 = *(class*)a;
        class arg2 = *(class*)b;
    
        if (arg1.height != arg2.height) {
            return arg2.height - arg1.height;
        } else {
            return strcmp(arg1.name, arg2.name);
        }
    }
    
    
  • 相关阅读:
    「BZOJ 1297」「SCOI 2009」迷路「矩阵乘法」
    「BZOJ 1831」「AHOI 2008」逆序对「贪心」
    「BZOJ 1791」「IOI 2008」Island「基环树」
    WC2019 冬眠记
    「ZOJ 1354」Extended Lights Out「高斯消元」
    「BZOJ 3270」博物馆「高斯消元」
    「学习笔记」泰勒级数
    获取iPhone的UDID
    面试题
    Java的post(HTTPS)请求-----接口测试
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7873710.html
Copyright © 2020-2023  润新知