pat B1065单身狗 学习一下stl里面的binary_search()

思路:

  1. 主要方法:散列+二分查找
  2. 开一个数组couple[],来存放夫妇们的ID。由于以后查找时不定是给老公的ID还是老婆的ID故两边都要存一下,你心中有我,我心中有你,夫妇二人,相敬如宾,海枯石烂。couple要初始化为[0-99999]以外的数字,这里主要强调不能是0。原因是有人的ID是0,而她/他当然不能随便无厘头成为别人的老公或老婆。
  3. 记录参加party的ladys and 乡亲们的ID,并排序。为什马要排序?因为排序的好处大大滴。
  4. 像紫霞仙子那样,进入partyer们的身体里,问问他们的椰子,里面装着谁。要是谁也没装,自然就是个光棍,可能是个男光棍,也可能是个女光棍,可能是个老光棍,也有可能是个小光棍,但这并不是我们关注的,我们关注的是中美合拍,啊不,走错片场了,抱歉。总之是个光棍就行。另外就是装着自己的小甜甜/臭猴子,这时便要看看小甜甜/臭猴子是不是也来了party,这时,你可能会说就是这会儿没来,那等一会也会来的,而且是身披五彩圣衣,脚踏七彩祥云。对此我表示认同,但是我想说我们应该吧注意力放到如何知道这位客官的小甜甜/臭猴子是不是也来了。当然是binary_search()了呀!!!要不然一遍遍的点名,我都受不了。就算我受得了,乡亲们也受不了。退一万步说,乡亲们受得了,OJ它受不了呀!

代码

include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

//-----------1065------------
const int maxn = 100010;
int couple[maxn];

int main(){
	for (int i = 0; i < maxn; i++){
		couple[i] = -1;
	}
	int n;
	scanf("%d", &n);
	int a, b;
	while (n--){
		scanf("%d %d", &a, &b);
		couple[a] = b;
		couple[b] = a;
	}
	int m;
	scanf("%d", &m);
	int party[10010] = {};
	for (int i = 0; i < m; i++){
		scanf("%d", party + i);
	}
	sort(party, party + m);
	vector<int> ans;
	for (int i = 0; i < m; i++){
		int t = couple[party[i]];
		if (t == -1 || !binary_search(party, party + m, t)){
			ans.push_back(party[i]);
		}
	}
	int s = ans.size();
	printf("%d\n", s);
	s--;
	for (int i = 0; i <= s; i++){
		printf("%d", ans[i]);
		if (i != s)
			putchar(' ');
	}
	return 0;
}

注意点:

  1. binary_search()的返回值类型为bool;下一篇会详细写一写
  2. 用int记录ID时,输出结果时,应当printf("%05d",ans[i]);
  3. couple数组中途一度想过要开两个数组men[maxn]; women[maxn]; 输入语句时men[a]=b;women[b]=a;后发现这样检索时很麻烦,又想要这样 men[a]=b;men[b]=a;women[a]=b;women[b]=a;再一想这不傻逼吗?直接一个数组不就完事了吗?这是才明白题目上没有重婚的好处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值