PAT-BASIC1065——单身狗/PAT-ADVANCED1121——Damn Single

我的PAT-BASIC代码仓:https://github.com/617076674/PAT-BASIC

我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED

原题链接:

PAT-BASIC1065:https://pintia.cn/problem-sets/994805260223102976/problems/994805266942377984

PAT-ADVANCED1121:https://pintia.cn/problem-sets/994805342720868352/problems/994805352359378944

题目描述:

PAT-BASIC1065:

PAT-ADVANCED1121:

知识点:标记数组

思路:用一大小为100000的数组来保存其另一半的值,另一同样大小的数组记录到场的人

注意点:

(1)最后的输出需要格式化输出,前面补0至5位。

(2)对于couples数组,需要将其值初始化为-1。因为题目中有00000这一合法编号,如果将couples数组初始化为0,那么无法区分其实没有伴侣还是伴侣编号为00000。如果将couples数组初始化为0,无法通过测试点1。

但是需要注意的是,如下错误代码能够获得通过:

#include<iostream>
#include<vector>

using namespace std;

int main(){
	
	int N;
	cin >> N;
	
	int couples[100000];
	for(int i = 0; i < 100000; i++){
		couples[i] = 0;
	}
	
	int tempNum1;
	int tempNum2;
	for(int i = 0; i < N; i++){
		cin >> tempNum1 >> tempNum2;
		couples[tempNum1] = tempNum2;
		couples[tempNum2] = tempNum1;
	}
	
	int M;
	cin >> M;
	
	int flags[100000];
	for(int i = 0; i < 100000; i++){
		flags[i] = 0;
	}
	
	int tempNum;
	for(int i = 0; i < M; i++){
		cin >> tempNum;
		flags[tempNum]++;
	}
	
	vector<int> results;
	for(int i = 0; i < 100000; i++){
		if(flags[i] == 1){
			if(flags[couples[i]] == 0){
                //对于单身狗来说,其couples[i]为0,即应该加入result
                //如果00000来了,那么flags[0]将不等于0,其他单身人士不会加入result,                    
                //就会出错,显然题目中的测试点没有这一种情况
                //还有一种情况是,00000来了,但是没有任何单身狗,这里的单身狗不包括那些
                //有伴侣但伴侣没来的情况
				results.push_back(i);
			}
		}
	}
	
	cout << results.size() << endl;
	for(int i = 0; i < results.size(); i++){
		printf("%05d", results[i]);
		if(i != results.size() - 1){
			cout << " ";
		}
	}
}

就像我在代码的注释里说的那样,题目有漏洞。测试点中编号为00000的人一定没有来或者编号为00000的人来了,但是没有单身狗,这里的单身狗不包括那些有伴侣但伴侣没来的情况。结合前面的分析,我们可以推断出测试点1的数据是后者,即编号为00000的人来了,但是没有任何单身狗,这里的单身狗不包括那些有伴侣但伴侣没来的情况。

时间复杂度是O(M),空间复杂度是O(100000)。

C++代码:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int couple[100000];
bool flag[100000];

int main(){
	fill(couple, couple + 100000, -1);
	fill(flag, flag + 100000, false);
	int N;
	scanf("%d", &N);
	int num1, num2;
	for(int i = 0; i < N; i++){
		scanf("%d %d", &num1, &num2);
		couple[num1] = num2;
		couple[num2] = num1;
	}
	int M, num;
	scanf("%d", &M);
	for(int i = 0; i < M; i++){
		scanf("%d", &num);
		flag[num] = true;
	}
	vector<int> single;
	for(int i = 0; i < 100000; i++){
		if(!flag[i]){
			continue;
		}
		if(couple[i] == -1 || (couple[i] != -1 && !flag[couple[i]])){
			single.push_back(i);
		}
	}
	sort(single.begin(), single.end());
	printf("%d\n", single.size());
	for(int i = 0; i < single.size(); i++){
		printf("%05d", single[i]);
		if(i != single.size() - 1){
			printf(" "); 
		}else{
			printf("\n");
		}
	}
	return 0;
}

C++解题报告:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>