buaa22级期末模拟

22级期末模拟

说在前面

我的方法还是有点暴力的。

在这里插入图片描述

思路

本题大致上是一个结构体快排的问题。

首先读入信息。对于读到的信息直接进行快排处理。

将ID和machine作为快排元素,接着对于数组进行遍历操作。利用一个hash表来存储信息,如果是非正常情况的,那么用ID建立hash表,为了打印时方便,添加一个i进入hash的结构体中,遍历hash表输出即可。

代码

//Author hugo
//Time 2023/6/8 19:18
/*
 *期末模拟
 *
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000000
typedef struct astu {
    int ID;
    char name[16];
    int machine;
    char time[7];
    int flag;
} Student;
Student stu[205];

int cmp(const void *e1, const void *e2) {
    Student *p = (Student *) e1;
    Student *q = (Student *) e2;
    if (p->ID == q->ID) {
        return p->machine - q->machine;
    }
    return p->ID - q->ID;
}
struct hash{
   int flag;
   int i;
} hash[MAXSIZE];
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d%s%d%s", &stu[i].ID, stu[i].name, &stu[i].machine, stu[i].time);
        stu[i].flag = 0;
    }
    qsort(stu, n, sizeof(Student), cmp);
//    putchar(10);
//    for (int i = 0; i < n; ++i) {
//        printf("%d %s %d %s\n",stu[i].ID, stu[i].name, stu[i].machine, stu[i].time);
//    }
    for (int i = 0; i < n - 1; ++i) {
        if (stu[i].ID == stu[i + 1].ID) {
            if(stu[i + 1].machine == stu[i].machine){
                continue;
            }else{
                hash[stu[i].ID].flag = 1;
                hash[stu[i].ID].i = i;
            }
        }
    }
    for (int i = 0; i < MAXSIZE; ++i) {
        if(hash[i].flag == 1) {
            int k = hash[i].i;
            printf("%d %s\n",stu[k].ID,stu[k].name);
        }
    }
    return 0;
}
/*
21
191028 wangdi 15 093000
192387 litong 39 093000
190877 liugang 37 093001
197583 huangqinian 196 093004
195211 liuhao 201 093005
193098 zhaogang 377 093006
190001 zhousheng 1 093007
190009 wuhong 12 093007
197583 huangqinian 197 093008
195877 lisisi 202 093008
192387 litong 309 093009
191000 tonghao 201 093402
197583 huangqinian 196 093500
191028 wangdi 15 093507
190010 wangzhuang 85 093558
195333 zhangye 63 093600
197583 huangqinian 195 094100
195211 liuhao 200 095103
190010 wangzhuang 287 095509
193098 zhaogang 377 095606
191028 wangdi 15 095709
【样例输出】
190010 wangzhuang
192387 litong
195211 liuhao
197583 huangqinian
 */
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值