您现在的位置是:主页 > news > 医院建设网站/百度站长工具app
医院建设网站/百度站长工具app
admin2025/5/4 16:03:59【news】
简介医院建设网站,百度站长工具app,英国做deal的网站,seo整站优化外包公司1.题目 https://pintia.cn/problem-sets/994805342720868352/problems/994805433955368960 给出选课人数和课程数,再分别给出每个人的选课情况,要输出每门课的选课人数和选了该课的所有学生的姓名。 2.思路 和之前的A1039做法一样(只不过是…
1.题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805433955368960
给出选课人数和课程数,再分别给出每个人的选课情况,要输出每门课的选课人数和选了该课的所有学生的姓名。
2.思路
和之前的A1039做法一样(只不过是输入和输出倒过来了——所以vector数组的数组元素vector[i]用来装每门课的选课学生,即方便最后输出每门课的学生)。
(1)用二维数组char[N][5]存放输入的姓名,其中char[i]表示第i个姓名,这里不像A1039将学生姓名用hash字符串映射转为数字id,按照一开始给出的学生名字顺序存入name[i],而name[course[i][j]]
表示i门课的course[i][j]号学生名字——注意j不是该学生编号,course[i][j]
才是学生编号(在printf之前已经对每门课的学生姓名按照字典序用sort排序了)。
以vector数组course[i]存放所有选第i门课的学生编号。
(2)在读入数据时,如果某学生i选择了课程j,则将该学生的编号i存入course[j]。
(3)对每门课i,将course[i]中的学生按姓名字典序从小到大排序最后输出。
3.代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=40010; //最大学生人数
const int maxc=2510; //最大课程门数char name[maxn][5]; //maxn个学生
vector<int> course[maxc]; //course[i]存放第i门课的所有学生编号
//注意上面的是vector数组
bool cmp(int a,int b){return strcmp(name[a],name[b])<0; //按姓名字典序从小到大排序
}
int main(){ int n,k,c,courseID;scanf("%d%d",&n,&k); //学生人数及课程数for(int i=0;i<n;i++){ //对每个学生进行遍历scanf("%s %d",name[i],&c);for(int j=0;j<c;j++){ //遍历每个学生的课程编号scanf("%d",&courseID); course[courseID].push_back(i); //将学生i加入第courseID门课中}}//输出操作for(int i=1;i<=k;i++){printf("%d %d\n",i,course[i].size()); //第i门课的学生数sort(course[i].begin() , course[i].end(), cmp);//对第i门课的学生排序for(int j=0; j<course[i].size() ; j++){printf("%s\n",name[ course[i][j] ]); //输出学生姓名}}system("pause");return 0;
}
4.注意
(1)使用string有时会超时。
(2)使用vector存放每门课的选课学生编号,可以有效防止所有学生选了所有课程的极端情况导致的空间超限,比直接使用二维数组方便。
(3)strcmp的返回值可能是其他正数或负数,而非一定是-1、0、1。
(4)使用字符串的下标来替代字符串本身进行排序,更快,不会导致大量的字符串移动。