1065 单身狗 (25 point(s))

#include <bits/stdc++.h>
using namespace std;

int main() {
	// N 夫妻/伴侣的对数 ID 号  5 位数字
	// M 派对的总人数 M 位客人的 ID
	int n, m;
	map<string, string> couples;
	set<string> guests, dogs; 
	
	cin >> n;
	while(n--){
		string str1, str2;
		cin >> str1 >> str2;
		
		// 夫妻可以互相找到 
		couples[str1] = str2, couples[str2] = str1;
	}
	
	cin >> m;
	while(m--){
		string str;
		cin >> str;
		guests.insert(str);
	}
	
	for(auto g: guests){
		// 不是夫妻 
		if(couples.find(g) == couples.end()) 
			dogs.insert(g);
		// 夫妻 但是对象没来
		else if(guests.find(couples[g]) == guests.end()) 
			dogs.insert(g);
	}
	
	// 第一行 落单 总人数
	cout << dogs.size() << endl;
	
	// 第二行按 ID 递增 列出落单客人
	int first = 0;
	for(auto d: dogs){
		cout << (first++ ? " " : "") << d;
	}
}

用 map 捆绑夫妻关系,以便可以从名字找到该名字另一半。

刚开始没有仔细看数据样例,只根据文字就入手了,以为派对上把具有夫妻身份的人排除了就可以了。但是测试发现,有些是有夫妻关系的,但也要算入“单身狗”里面。这题还满迷的。


如果用 string 类型来读取 ID 后面就不需要补齐高位的 0 了。很多题目都是这样,说是数字实际上数字可能前面有 0 会导致 0 读取时被丢弃了。还不如直接用 string 。

不过如果用 int 的话,看别人也可以用两个函数来补救一下,一个是 setw,设置输出时候的宽度,小于宽度的时候默认填充空格。再一个是 setfill,设置填充的字符,用来搭配前面的函数,设置一个 '0' 替换原来的空格。这样就可以高位补 0 了。

参考代码

setfill()函数

posted on 2021-09-07 12:13  Atl212  阅读(69)  评论(0)    收藏  举报

导航