0
点赞
收藏
分享

微信扫一扫

1065 单身狗

624c95384278 2022-03-22 阅读 125
c++

1065 单身狗

在这里插入图片描述

思路:

  • 用一个大小为100010的int数组Q存储所有的到场者。
  • 读取所有的情侣序号,用一个map进行一一对应,即mp[a]=b, mp[b]=a。
  • 用一个数组P存储所有的到场者
  • 对P进行第一次遍历,把P作为Q的角标。抽到任一人时,假如map中能找到,那么数组Q中他和他的情侣全部+1。否则就自己+1
  • 对P进行第二次遍历,把P作为Q的角标。假如值为2说明情侣二人都在,而值为1说明落单(情侣只来了1人或者本来就是单身),用一个vector存储。
  • 对vector进行升序排序然后输出

PS:

  • 注意最后输出格式用printf("%05d",x),测试点3
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>

using namespace std;

int Q[100010];
int P[100010];
vector<int> ve;
map<int, int> mp;

int main(void) {

	// 读取所有的情侣序号,用一个map进行一一对应,即mp[a]=b, mp[b]=a。
	int n; cin >> n;
	for (int i = 0; i < n; i++) {
		int a, b; cin >> a >> b;
		mp[a] = b;
		mp[b] = a;
	}

	// 用一个数组P存储所有的到场者
	int k; cin >> k;
	for (int i = 0; i < k; i++) {
		int x; cin >> x;
		P[i] = x;
	}

	// 对P进行第一次遍历,把P作为Q的角标。抽到任一人时,假如map中能找到,那么数组Q中他和他的情侣全部+1。否则就自己+1
	for (int i = 0; i < k; i++) {
		Q[P[i]]++;
		if (mp.find(P[i]) != mp.end()) {
			Q[mp[P[i]]]++;
		}
	}

	// 对P进行第二次遍历,把P作为Q的角标。假如值为1说明落单,用一个vector存储。
	for (int i = 0; i < k; i++) {
		if (Q[P[i]] == 1) {
			ve.push_back(P[i]);
		}
	}

	// 对vector进行升序排序然后输出
	sort(ve.begin(), ve.end());
	cout << ve.size() << endl;
	for (int i = 0; i < ve.size(); i++) {
		if (i != 0) { cout << " "; }
		printf("%05d", ve[i]);
	}
	return 0;
}
举报

相关推荐

0 条评论