1.总结:vector真的贼好用,不仅可以根据输入数据设置大小,节省空间,而且可以一维,二维,多维各种数据类型的组合。
2.cin,cout这种题肯定会超时,以后注意用char*,scanf和printf
3.参考代码用的很巧秒,因为name只有三个字母,可以映射到hash表中(占用数组空间也不大),大大提升了效率
4.还是先想思路,在写代码才会下笔如有神!!!
代码(最后一个点超时):
#include<iostream>
#include<vector>
#include<string>
#include<unordered_map>
#include<algorithm>
using namespace std;
int n; //学生数
int k; //课程
struct node{
int num;
string name;
int course[1100];
node()
{
num = 0;
}
};
unordered_map<string, node> gg;
int sizz[2511];
string sss[11000]; int g = 0;
int main()
{
cin >> n >> k;
vector<vector<string> > pp(k+4,vector<string>(255));
for (int i = 1; i <= k; i++)
{
int index, size;
scanf("%d%d", &index, &size); sizz[index]=size;
for (int j = 1; j <= size; j++)
{
cin >> pp[index][j];
}
}
for (int i = 0; i < n; i++)
{
pair<string,node> s;
cin >> s.first; sss[g++] = s.first;
gg.insert(s);
}
for (int i = 1; i <= k; i++)
{
for (int j = 1; j <= sizz[i]; j++)
{
gg[pp[i][j]].course[gg[pp[i][j]].num++] = i;
}
}
for (int i = 0; i < g;i++)
{
cout << sss[i];
printf(" %d", gg[sss[i]].num); if (gg[sss[i]].num != 0)printf(" ");
for (int j = 0; j < gg[sss[i]].num; j++)
{
printf("%d",gg[sss[i]].course[j]);
if (j!= gg[sss[i]].num - 1)printf(" ");
}
if(i!=g-1)printf("\n");
}
return 0;
}
参考代码:
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int getid(char *name) {
int id = 0;
for(int i = 0; i < 3; i++)
id = 26 * id + (name[i] - 'A');
id = id * 10 + (name[3] - '0');
return id;
}
const int maxn = 26 * 26 * 26 * 10 + 10;
vector<int> v[maxn];
int main() {
int n, k, no, num, id = 0;
char name[5];
scanf("%d %d", &n, &k);
for(int i = 0; i < k; i++) {
scanf("%d %d", &no, &num);
for(int j = 0; j < num; j++) {
scanf("%s", name);
id = getid(name);
v[id].push_back(no);
}
}
for(int i = 0; i < n; i++) {
scanf("%s", name);
id = getid(name);
sort(v[id].begin(), v[id].end());
printf("%s %lu", name, v[id].size());
for(int j = 0; j < v[id].size(); j++)
printf(" %d", v[id][j]);
printf("\n");
}
return 0;
}