1047 Student List for Course (25分)
题目链接
题目描述:
Sample Input:
10 5
ZOE1 2 4 5
ANN0 3 5 2 1
BOB5 5 3 4 2 1 5
JOE4 1 2
JAY9 4 1 2 5 4
FRA8 3 4 2 5
DON2 2 4 5
AMY7 1 5
KAT3 3 5 4 2
LOR6 4 2 4 1 5
Sample Output:
1 4
ANN0
BOB5
JAY9
LOR6
2 7
ANN0
BOB5
FRA8
JAY9
JOE4
KAT3
LOR6
3 1
BOB5
4 7
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
5 9
AMY7
ANN0
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
方法1:(设置一个并行数组,每次存进去人名的标号,然后记录人名,输出的时候利用人名标号找到相应的人名)
#include <bits/stdc++.h>
using namespace std;
vector<int>a[2600];
char str[41000][5];
bool cmp(int a,int b)
{
if(strcmp(str[a],str[b])<0)
return true;
else
return false;
}
int main()
{
int n,m,i,j,x,y;
scanf("%d%d",&n,&m);
for(i=0; i<n; i++)
{
scanf("%s %d",str[i],&x);
while(x--)
{
scanf("%d",&y);
a[y].push_back(i);
}
}
for(i=1; i<=m; i++)
{
printf("%d %d\n",i,a[i].size());
sort(a[i].begin(),a[i].end(),cmp);
for(j=0; j<a[i].size(); j++)
printf("%s\n",str[a[i][j]]);
}
return 0;
}
方法二:(把人名化成数字存起来,然后输出的时候再把数字转化成相应的人名)
#include <bits/stdc++.h>
using namespace std;
vector<int>a[26*26*26+15];
bool cmp(int a,int b)
{
return a<b;
}
int get_id(char str[])
{
int id=0,i;
for(i=0; i<3; i++)
id=id*26+str[i]-'A';
id=id*10+str[3]-'0';
return id;
}
int main()
{
int n,m,i,j,x,y;
char str[5];
scanf("%d%d",&n,&m);
for(i=0; i<n; i++)
{
scanf("%s %d",str,&x);
while(x--)
{
scanf("%d",&y);
int id=get_id(str);
a[y].push_back(id);
}
}
for(i=1; i<=m; i++)
{
printf("%d %d\n",i,a[i].size());
sort(a[i].begin(),a[i].end(),cmp);
for(j=0; j<a[i].size(); j++)
{
printf("%c",a[i][j]/10/26/26%26+'A');
printf("%c",a[i][j]/10/26%26+'A');
printf("%c",a[i][j]/10%26+'A');
printf("%c",a[i][j]%10+'0');
printf("\n");
}
}
return 0;
}