By Jalan
题干
浙大4w人2500课,给学生的课表输出课的学生表,说实话刷PTA经常看到这个4w2500…对比一下人数确实可能我校这辈子想超过浙大希望是很渺茫了,不过说回来不知道浙大同学选课会不会比我们还难受…
输入条件
第一行2个数,一个是学生数N[0,40000],一个是课程数K[0,2500]
接下来有N行每行是人的名称(三位大写字母加一位数字组成) 这个人的课程数C[0,20] 然后是空格分隔的C门课
课程编号是1-K
输出条件
按课程编号升序打印课程编号,空格,课程人数,\n,参与的人\n.
题解
第一次
思路
人名是固定的三位大写字母加一个数字的形式,因此可以把人名加密成一个int(262626*10)
根据课程创建一个链表,把人往进插就行.
预期时间复杂度
n档,实际比n大点
编写用时
38分钟
代码
CPP
#include<cstdio>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct node{
vector<int> list;
}node;
int code(char *name){//加密人名
int namecode=0;
namecode+=name[0]-'A';
namecode*=26;
namecode+=name[1]-'A';
namecode *= 26;
namecode += name[2] - 'A';
namecode *= 10;
namecode += name[3] - '0';
return namecode;
}
void decode(int namecode,char *name){//解密人名
name[3]=namecode%10+'0';
namecode/=10;
name[2] = namecode % 26 + 'A';
namecode /= 26;
name[1] = namecode % 26 + 'A';
namecode /= 26;
name[0] = namecode + 'A';
name[4]='\0';
}
bool cmp(int a,int b){
return a>b?false:true;
}
int main(int argc, char const *argv[])
{
//input&&process
int N,K;
scanf("%d%d",&N,&K);
vector<node> course(K+5);
for (int i = 0; i < N; i++)
{
char name[5];
int nameCode=0;
int courseNumber;
scanf("%s",name);
nameCode=code(name);
scanf("%d",&courseNumber);
for (int j = 0; j < courseNumber; j++)
{
int temporaryCourse;
scanf("%d",&temporaryCourse);
course[temporaryCourse].list.push_back(nameCode);
}
}
//output
for (int i = 1; i <= K; i++)
{
printf("%d %d\n",i,course[i].list.size());
sort(course[i].list.begin(), course[i].list.end(),cmp);
for (int j = 0; j < course[i].list.size(); j++)
{
char name[5];
decode(course[i].list[j],name);
printf("%s\n",name);
}
}
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@