PAT A1039 Course List for Student

PAT A1039 Course List for Student

在这里插入图片描述

Sample Input:

11 5
4 7
BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
1 4
ANN0 BOB5 JAY9 LOR6
2 7
ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6
3 1
BOB5
5 9
AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6 NON9

Sample Output:

ZOE1 2 4 5
ANN0 3 1 2 5
BOB5 5 1 2 3 4 5
JOE4 1 2
JAY9 4 1 2 4 5
FRA8 3 2 4 5
DON2 2 4 5
AMY7 1 5
KAT3 3 2 4 5
LOR6 4 1 2 4 5
NON9 0
  • A1047逆命题

  • 思路 1:
    用一个vector数组在读入时记录每个学生的选课,再查询,输出

  • code 1:

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int M = 26*26*26*10 + 1;
vector<int> course[M];
int change(char s[]){
	int id = 0;
	for(int i = 0; i < 3; ++i){
		id = id * 26 + (s[i]-'A');
	}
	id = id * 10 + (s[3] - '0');
	return id;
}
int main(){
	int n, m;
	scanf("%d %d", &n, &m);
	int nC, nP;
	char name[5];
	for(int i = 0; i < m; ++i){
		scanf("%d %d", &nC, &nP);
		for(int i = 0; i < nP; ++i){
			scanf("%s", name);
			int id = change(name);
			course[id].push_back(nC);
		}
	}
	for(int i = 0; i < n; ++i){
		scanf("%s", name);
		int id = change(name);
		printf("%s ", name);
		sort(course[id].begin(), course[id].end());
		int len = course[id].size();
		printf("%d", len);
		for(int j = 0; j < len; ++j){
			printf(" %d", course[id][j]);	//!!!:TIPS 1:前面有内容的格式化输出 
		}
		printf("\n");
	}
	return 0;
}
  • 思路:直接map 超时边缘试探…

  • T2 code:

#include <bits/stdc++.h>
using namespace std;
unordered_map<string, vector<int> > mp;

int main(){
	int n, m;
	scanf("%d %d", &n, &m);
	for(int i = 0; i < m; ++i){
		int idex, cnt;
		scanf("%d %d", &idex, &cnt);
		for(int j = 0; j < cnt; ++j){
			string name;
			cin >> name;
			mp[name].push_back(idex);
		}
	}
	for(int i = 0; i < n; ++i){
		string q_name;
		cin >> q_name;
		cout << q_name << " " << mp[q_name].size() ;
		sort(mp[q_name].begin(), mp[q_name].end());
		for(int j = 0; j < mp[q_name].size(); ++j){
			printf(" %d", mp[q_name][j]);
		}
		cout << endl;
	}
	return 0;
}
  • T3 code:
#include <bits/stdc++.h>
using namespace std;

unordered_map<int, set<int> > mp;
int Change(char s[])
{
    int id = 0;
    for(int i = 0; i < 3; ++i)
    {
        id = id * 26 + (s[i] - 'A');
    }
    return id * 10 + (s[3] - '0');  // 别忘了 * 10
}
int main()
{
    int nq, n;
    scanf("%d %d", &nq, &n);
    for(int i = 0; i < n; ++i)
    {
        int idex, np;
        scanf("%d %d", &idex, &np);
        for(int j = 0; j < np; ++j)
        {
            char name[5];
            scanf("%s", name);
            mp[Change(name)].insert(idex);
        }
    }
    for(int i = 0; i < nq; ++i)
    {
        char qname[5];
        scanf("%s", qname);
        int id = Change(qname);
        printf("%s %d", qname, mp[id].size());
        for(auto it = mp[id].begin(); it != mp[id].end(); ++it)
        {
            printf(" %d", *it);
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值