PAT(B) 1065 单身狗(Java:17分,C:25分)
题目描述
“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式
输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 10 000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。
输出格式
首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。
测试样例
Case 0:
3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333
5
10000 23333 44444 55555 88888
Case 1:
3
11111 22222
33333 44444
55555 66666
4
55555 44444 66666 33333
0
分析💬
Java 和 C 代码思路一样,但是 Java 有两组数据超时。
- 一个数组保存对象的 ID
- 一个数组保存到场的情况
- 一个数组保存单身狗
- 没有对象的,对象没到场的都是单身狗
Java代码(17分)
/*
Case 3: TLE
Case 4: TLE
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
private static final int MAX_ID = 99999;
private static BufferedReader input;
private static int coupleNumber;// 夫妻对数
private static int[] coupleID;// 丈夫/妻子的 ID
private static int totalPeople;// 派对总人数
private static int[] guestID;// 客人 ID
private static boolean[] flagPresent;// 到场标志
private static void initBufferedReader() {
InputStreamReader isr = new InputStreamReader(System.in);
input = new BufferedReader(isr);
}
private static void inputData() {
initCoupleNumber();
initCoupleID();
initTotalPeople();
initGuestID();
initFlagPresent();
}
private static void initCoupleNumber() {
String str = "0";
try {
str = input.readLine();
} catch (IOException e) {
}
coupleNumber = Integer.parseInt(str);// 夫妻对数
}
private static void initCoupleID() {
coupleID = new int[MAX_ID + 1];
for (int i = 0; i <= MAX_ID; ++i) {
coupleID[i] = -1;
}
for (int i = 0; i < coupleNumber; ++i) {
String str = "";
try {
str = input.readLine();
} catch (IOException e) {
}
String[] arr = str.split(" ");
int aID = Integer.parseInt(arr[0]);
int bID = Integer.parseInt(arr[1]);
coupleID[aID] = bID;
coupleID[bID] = aID;
}
}
private static void initTotalPeople() {
String str = "0";
try {
str = input.readLine();
} catch (IOException e) {
}
totalPeople = Integer.parseInt(str);
}
private static void initGuestID() {
guestID = new int[totalPeople];
String str = "";
try {
str = input.readLine();
} catch (IOException e) {
}
String[] arr = str.split(" ");
for (int i = 0; i < totalPeople; ++i) {
guestID[i] = Integer.parseInt(arr[i]);
}
Arrays.sort(guestID);
}
private static void initFlagPresent() {
flagPresent = new boolean[MAX_ID + 1];
for (int i = 0; i < totalPeople; ++i) {
flagPresent[guestID[i]] = true;
}
}
private static int[] getSingleDogs() {
int[] singleDogs = new int[totalPeople];
int singleNumber = 0;
for (int i = 0; i < totalPeople; ++i) {
int myID = guestID[i];
int partnerID = coupleID[myID];
if (partnerID < 0 || !flagPresent[partnerID]) {
singleDogs[singleNumber++] = myID;
}
}
return Arrays.copyOfRange(singleDogs, 0, singleNumber);
}
private static void outputSingleDogs(int[] singleDogs) {
int length = singleDogs.length;
System.out.println(length);
System.out.printf("%05d", singleDogs[0]);
for (int i = 1; i < length; ++i) {
System.out.printf(" %05d", singleDogs[i]);
}
}
public static void main(String[] args) {
initBufferedReader();
inputData();
int[] singleDogs = getSingleDogs();
outputSingleDogs(singleDogs);
}
}
C代码
/*****************************************************************************
Submit Time Status Score Problem Compiler Run Time User
8/27/2019, 19:49:25 Accepted 25 1065 C (gcc) 13 ms wowpH
*****************************************************************************/
#include<stdio.h>
#include<memory.h> // memset头文件
#include<stdlib.h> // qsort头文件
#define MAX_GUEST 100000 // 最大客人人数
int coupleNumber; // 夫妻对数
int totalPeople; // 派对总人数
int partnerID[MAX_GUEST]; // 对象ID
int guest[MAX_GUEST]; // 客人
int flagPresent[MAX_GUEST]; // 是否到场
int singleDogs[MAX_GUEST]; // 单身狗
int singleDogsNumber; // 单身狗人数
void initData(); // 初始化数据
void inputData(); // 输入数据
int cmp(const int* a, const int* b); // 比较函数
void processData(); // 处理部分数据
int checkSingleDog(int id); // 检查id是否是单身狗
void setSingleDogs(); // 计算单身狗
void outputSingleDogs(); // 输出单身狗
int main() {
initData();
inputData();
processData();
setSingleDogs();
outputSingleDogs();
return 0;
}
void initData() {
memset(partnerID, -1, sizeof(partnerID));
memset(flagPresent, -1, sizeof(flagPresent));
}
void inputData() {
scanf("%d", &coupleNumber);
int id1, id2;
for (int i = 0; i < coupleNumber; ++i) {
scanf("%d %d", &id1, &id2);
partnerID[id1] = id2;
partnerID[id2] = id1;
}
scanf("%d", &totalPeople);
for (int i = 0; i < totalPeople; ++i) {
scanf("%d", &guest[i]);
}
}
int cmp(const int* a, const int* b) { // 升序
return (*a) - (*b);
}
void processData() {
qsort(guest, totalPeople, sizeof(int), cmp); // 客人排序
for (int i = 0; i < totalPeople; ++i) {
flagPresent[guest[i]] = 1; // 设置客人到场标志
}
}
void setSingleDogs() {
singleDogsNumber = 0;
for (int i = 0; i < totalPeople; ++i) {
int self = guest[i];
if (checkSingleDog(self) > 0) {
singleDogs[singleDogsNumber++] = guest[i]; // 是单身狗
}
}
}
int checkSingleDog(int id) {
int partner = partnerID[id];
if (partner < 0) { // 没有对象
return 1;
} else if (flagPresent[partner] < 0) { // 有对象,但没到场
return 1;
}
return -1;
}
void outputSingleDogs() {
printf("%d\n", singleDogsNumber);
for (int i = 0; i < singleDogsNumber; ++i) {
if (i > 0) {
printf(" ");
}
printf("%05d", singleDogs[i]);
}
}