“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
输入第一行给出一个正整数 N(≤50000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤10000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。
输出格式:
首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。
输入样例:
3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333
输出样例:
5
10000 23333 44444 55555 88888
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
当我看到这个时间限制的时候,我毅然决然放弃了使用java写程序的想法,转身投入C语言的怀抱!
先贴上代码:
#include <stdio.h>
#define Max 100000
int N , M;
void BuildHeap(int A[],int i,int Number) //构造堆
{
int c,temp;
for (temp=A[i];2*i <= Number; i=c) //temp记录下父母节点的值,c为一个子女节点
{
c=2*i;
if(c < Number && A[c + 1] > A[c])//找到最大的子女节点
++c;
if(temp<A[c]) //父母节点值等于子女节点中大的
A[i]=A[c];
else
break;
}
A[i]=temp;//对被交换的子女节点赋值 比如在2 9 8 6 5 7中9和2交换后,2需要和6再进行交换,最后只需要对6最开始的位置赋值2就行
}
void Heapsort(int a[]) //排序
{
int i,temp;
for(i=M/2;i>=1;i--) //从最后一个父母节点开始,知道根节点
{
BuildHeap(a,i,M);
}
for(i=M;i>0;i--) //删除根节点后,重新构造堆
{
temp=a[1];
a[1]=a[i];
a[i]=temp;
BuildHeap(a,1,i-1);
}
}
int main() {
int Couple[Max];
for (int i = 0; i < Max; ++i) {
Couple[i] = -1;
}
scanf("%d" , &N);
for (int i = 0; i < N; ++i) {
int couple1 , couple2;
scanf("%d %d" , &couple1 , &couple2);
Couple[couple1] = couple2;
Couple[couple2] = couple1;
}
scanf("%d" , &M);
int Participators[M + 1];
for (int i = 1; i <= M; ++i) {
scanf("%d" , &Participators[i]);
}
Heapsort(Participators);
int num = 0;
int dogs[M];
for (int i = 1; i <= M; ++i) {
dogs[i] = 0;
int code = Participators[i];
if(Couple[code] != -1){
int newcode = Couple[code];
for(int j = i + 1; j <= M ; j++){
if(Couple[code]== Participators[j]){
Couple[code] = -2;
Couple[newcode] = -2;
break;
}
}
}
if(Couple[code] == -2){
continue;
}
dogs[num] = Participators[i];
num++;
}
printf("%d\n" , num);
if(num == 0){
return 0;
}
if(0 <= dogs[0] && dogs[0] <= 9){
printf("0000");
printf("%d" , dogs[0]);
} else if(10 <= dogs[0] && dogs[0] < 100){
printf("000");
printf("%d" , dogs[0]);
}else if(100 <= dogs[0] && dogs[0] < 1000){
printf("00");
printf("%d" , dogs[0]);
}else if(1000 <= dogs[0] && dogs[0] < 10000){
printf("0");
printf("%d" , dogs[0]);
}else printf("%d" , dogs[0]);
for (int i = 1; i < M; ++i) {
if(dogs[i] != 0){
if(0 <= dogs[i] && dogs[i] <= 9){
printf(" 0000");
printf("%d" , dogs[i]);
} else if(10 <= dogs[i] && dogs[i] < 100){
printf(" 000");
printf("%d" , dogs[i]);
}else if(100 <= dogs[i] && dogs[i] < 1000){
printf(" 00");
printf("%d" , dogs[i]);
}else if(1000 <= dogs[i] && dogs[i] < 10000){
printf(" 0");
printf("%d" , dogs[i]);
}else printf(" %d" , dogs[i]);
}
}
}
因为看到这个时间如此之严格的限制,我选择了堆排序,参考来源:http://t.csdnimg.cn/kcVKkhttp://t.csdnimg.cn/kcVKk
然后我的思路是这样的:
最后再加上优化一下打印就行了。
运行结果: