问题A:学生课程列表
http://codeup.cn/problem.php?cid=100000596&pid=0
类似于一个数据库你前面输入的数据都进到里面了。
你输入一个人,输出他对应的信息。
用一个int型的vector,再先将字符串转换成对应的数值id用定址法统计。
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
vector<int> stu[175761];//即学生编号数26*26*26*10+1
int str_int(char a[])
{
int sum=0;
for(int i=0;i<3;i++)
{
sum=sum*26+a[i]-'A';
}
sum=sum*10+a[3]-'0';
return sum;
}
int main(void)
{
int people,book;
int number,n;
char name[20];
cin>>people>>book;
while(book)
{
cin>>number>>n;
for(int i=0;i<n;i++)
{
scanf("%s",name);
stu[str_int(name)].push_back(number);
}
book--;
}
while(people)
{
scanf("%s",name);
printf("%s ",name);
printf("%d",stu[str_int(name)].size());
sort(stu[str_int(name)].begin(),stu[str_int(name)].end());
for(int i=0;i<stu[str_int(name)].size();i++)
{
printf(" %d",stu[str_int(name)][i]);
}
printf("\n");
people--;
}
return 0;
}
问题B:课程学生名单
http://codeup.cn/problem.php?cid=100000596&pid=1
题目分析:
用一个vector的容器数组 来保存各个的人名。
用定址法,看到学生选的编号,就向对应的容器加入。
最后挨个输出。输出前要按字典序排序,自己写一个cmp 用sort排
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(string a,string b)
{
return a<b;
}
int main(void)
{
int people,book;
int i,j,k;
int n;//每一个人选的科目书
int number;//选的科目号
string str;
vector<string> peoples[2505];
cin>>people>>book;
for(i=0;i<people;i++)
{
cin>>str;
scanf("%d",&n);
for(int j=0;j<n;j++)
{
scanf("%d",&number);
peoples[number].push_back(str);
}
}
for(i=1;i<=book;i++)
{
printf("%d %d\n",i,peoples[i].size());
sort(peoples[i].begin(),peoples[i].end(),cmp);
for(j=0;j<peoples[i].size();j++)
{
cout<<peoples[i][j]<<endl;
}
}
return 0;
}