PAT(B) 1065 单身狗(Java:17分,C:25分)

108 篇文章 0 订阅
68 篇文章 3 订阅

题目链接:1065 单身狗 (25 point(s))

题目描述

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式

输入第一行给出一个正整数 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]);
	}
}

提交结果(C)

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值