【PAT B1065】 单身狗 (25 分)

本文介绍了一种算法,用于从已知伴侣关系中找出单身参与者。通过使用STL set和哈希表,该算法能够高效地处理大规模数据集,并按ID递增顺序输出所有单身者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1065 单身狗 (25 分)

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:

输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 10 000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。

输出格式:

首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。

输入样例:

3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333

输出样例:

5
10000 23333 44444 55555 88888

 =======================================================================

考察STL-set的使用。

单身狗有两种:一是本身就没伴侣的;二是有伴侣,但伴侣不在场的。

首先,数组couple初始为-1,输入n对 伴侣。

    for(int i = 0; i < n; i++){
        scanf("%d %d", &a, &b);
        couple[a] = b;
        couple[b] = a;
    }

没伴侣的人默认值为-1。输入很简单,好理解。

然后,输入所有到场宾客。如果TA是有伴侣的,要进一步检查TA的伴侣在不在场,hash[TA伴侣的编号] = 1(哈希)。

 

遍历所有到场宾客,如果hash[当前宾客编号] == 1,则当前的TA是在场其他某个人的伴侣,TA不是单身狗。

 

如果是hash值为0,一是当前宾客TA的伴侣不在场,是单身狗。二是本身就没有伴侣(hash值也是0)。把当前宾客的编号存放到到set<int> s中。

 

最后遍历set输出结果即可。

=======================================================================

#include <iostream>
#include <set>
#include <vector>
int main(){
	int n, a, b, m;
	scanf("%d", &n);
	vector<int> couple(100000, -1);
	for(int i = 0; i < n; i++){
		scanf("%d %d", &a, &b);
		couple[a] = b;
		couple[b] = a;
	}
	scanf("%d", &m);
	vector<int> v, hash(100000);
	for(int i = 0; i < m; i++){
		scanf("%d", &v[i]);
		if(couple[v[i]] != -1) hash[couple[v[i]]] = 1;
	}
	set<int> ans;
	for(int i = 0; i < m; i++)
		if(hash[v[i]] != 1) ans.insert(v[i]);
	for(auto: it = ans.begin(); it != ans.end(); it++){
		if(it != ans.begin()) printf(" ");
		printf("%d", *it);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值