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
*/