我的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++解题报告: