7-1 单身狗(PTA - 数据结构)

 由于这道题在留的作业中,排序和查找都有,所以我先写这道题(图的先放放)


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

输入格式:

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


 提交结果:


思路分析: 

        要找,要排,限制了时间。

        排序的话,这里使用了快速排序算法(真的很快!),其他有人用的堆排序,可以去尝试一下。找就得自己想办法找了。

如何输入:

        题目中给的是一对一对的,所以这里考虑要整个结构体去存:

typedef struct {
    int his_couple;    //他的对象
    int BOrS;          //对象比他大还是小,小的话是-1,大的话是1
    int yeah;          //有对象,1为有,0为无,2为查找的时候已经找到过他对象了
}Couple;

         下标当作id来存一个人的信息。

如何查找(顺便找到单身人数):

        先排序一下输入的人的id,小的在前面。然后开始遍历来的人,也就是数组man。如果一个人在couple中的yeah值为1,而且BOrS(big or small)为1,那么就去往后找他的对象来没来,没来就进入单身行列,来了就不是。如果BOrS为-1(因为是从前往后,从小往大id找对象的,他要是被找过,那只能说他对象比他小,且yeah已经被置为了2),那么检查他的yeah,yeah不是2就进入单身行列。其余yeah都是0,那只能也进入单身行列。

int Search(Couple c[],int man[], int nums,int single[]){
    int flag = 0;
    for (int i = 0;i<nums;i++) {
        if (c[man[i]].yeah == 1) {
            if (c[man[i]].BOrS == 1) {
                int judge = 0;
                for (int j = i + 1; j < nums; ++j) {
                    if (c[man[j]].his_couple == man[i]) {   //有他伴侣
                        c[man[j]].yeah = 2;         //已经检查过了
                        judge = 1;
                        break;
                    }
                }
                if(judge == 0)
                    single[flag++] = man[i];
            }
            if ((c[man[i]].BOrS == -1)&&(c[man[i]].yeah != 2)) {
                single[flag++] = man[i];
            }
        }
        else if(c[man[i]].yeah == 2) {
            continue;
        }
        else {
            single[flag++] = man[i];
        }
    }
    return flag;
}
输出打印:

        因为man已经排好序了,所以得到的single数组也应当是有序的,所以直接打印就行,然后注意一下空格和0补位。之前写过补位代码,直接拿过来。space处理空格问题(具体见主函数传参)。

void Print(int id,int space){
    if(id == -1)
        return;
    if(id>=10000)
        printf("%d",id);
    else if(id >= 1000)
        printf("0%d",id);
    else if(id >= 100)
        printf("00%d",id);
    else if(id >= 10){
        printf("000%d",id);
    }
    else if(id >= 0){
        printf("0000%d",id);
    }
    if(space == 1)
        printf(" ");
}
注意: 

        一定要初始化结构体数组!!!


代码展示: 

//
// Created by DDD on 2023/12/19.
//
#include <stdio.h>
#include <malloc.h>
#define MAX 100000

typedef struct {
    int his_couple;
    int BOrS;
    int yeah;
}Couple;

void QuickSort(int array[], int low, int high) {    //快排
    int i = low;
    int j = high;
    if(i >= j) {
        return;
    }
    int temp = array[low];
    while(i != j) {
        while(array[j] >= temp && i < j) {
            j--;
        }
        while(array[i] <= temp && i < j) {
            i++;
        }
        if(i < j) {
            int t = array[j];
            array[j] = array[i];
            array[i] = t;

        }
    }
    int t = array[low];
    array[low] = array[i];
    array[i] = t;
    QuickSort(array, low, i - 1);
    QuickSort(array, i + 1, high);
}

int Search(Couple c[],int man[], int nums,int single[]){
    int flag = 0;
    for (int i = 0;i<nums;i++) {
        if (c[man[i]].yeah == 1) {
            if (c[man[i]].BOrS == 1) {
                int judge = 0;
                for (int j = i + 1; j < nums; ++j) {
                    if (c[man[j]].his_couple == man[i]) {   //有他伴侣
                        c[man[j]].yeah = 2;         //已经检查过了
                        judge = 1;
                        break;
                    }
                }
                if(judge == 0)
                    single[flag++] = man[i];
            }
            if ((c[man[i]].BOrS == -1)&&(c[man[i]].yeah != 2)) {
                single[flag++] = man[i];
            }
        }
        else if(c[man[i]].yeah == 2) {
            continue;
        }
        else {
            single[flag++] = man[i];
        }
    }
    return flag;
}

void Print(int id,int space){
    if(id == -1)
        return;
    if(id>=10000)
        printf("%d",id);
    else if(id >= 1000)
        printf("0%d",id);
    else if(id >= 100)
        printf("00%d",id);
    else if(id >= 10){
        printf("000%d",id);
    }
    else if(id >= 0){
        printf("0000%d",id);
    }
    if(space == 1)
        printf(" ");
}

int main(){
    int n;
    scanf("%d",&n);
    Couple c[MAX]={0};
    for (int i = 0; i < n; ++i) {
        int x, y;
        scanf("%d %d",&x,&y);
        c[x].his_couple = y;
        c[y].his_couple = x;
        c[x].yeah = 1;
        c[y].yeah = 1;          //有伴侣
        if(x>y){
            c[x].BOrS = -1;     //他的伴侣比他小
            c[y].BOrS = 1;
        }
        else{
            c[x].BOrS = 1;
            c[y].BOrS = -1;
        }
    }
    int m;
    scanf("%d",&m);
    int man[m];
    for (int i = 0; i < m; ++i) {
        scanf("%d",&man[i]);
    }
    int single[m];
    QuickSort(man,0,m-1);
    if(n!=0) {
        int flag = Search(c, man, m, single);
        printf("%d\n", flag);
        for (int i = 0; i < flag; ++i) {
            if (i < flag - 1)
                Print(single[i],1);
            else {
                Print(single[i],0);
            }
        }
    }
    else{
        printf("%d\n",m);
        for (int i = 0; i < m; ++i) {
            if (i < m - 1)
                Print(man[i],1);
            else {
                Print(man[i],0);
            }
        }
    }
}

return 0;//祝大家早日离开single,把自己的yeah置为1!!

(很有意义的一道题)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/261927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux笔记---文件查看和编辑

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 cat (Concatenate and Display): more 和 less: nano 和 vim (文本编辑器): 结语 我的其他博客 前言 学习Linux命令行和文件…

C++实现位图

目录 一、什么是位图 二、位图类 1.参数及构造函数 2.set函数设置为1&#xff08;代表存在&#xff09; 3.reset函数设置为0&#xff08;代表不存在&#xff09; 4.test函数查看状态&#xff08;0还是1&#xff09; 三、位图的变形 一、什么是位图 位图这个词汇比较少见…

im6ull学习归纳总结(一)APP——04_文件IO

4.1文件从何而来 如图所示文件可以是 1真实文件保存在设备上 2内核提供的虚拟文件 3设备节点 4.2文件的访问方式 4.2.1通用IO模型&#xff1a;open/read/write/lseek/close 实验1 copy文件 代码 #include <sys/types.h> #include <sys/stat.h> #include <fc…

10 个顶级免费 Android 数据恢复软件可帮助恢复已删除的文件

不小心删除了手机上的一些重要数据或文件&#xff1f;这很不幸&#xff0c;但不要悲伤或放弃希望&#xff0c;因为仍有机会恢复它们。 10 个顶级免费 Android 数据恢复软件 虽然 Android 手机没有像 Windows 那样的回收站可以自动存储您删除的数据&#xff0c;但是有很多功能强…

大模型时代下的因果推断

导读&#xff1a;在数字化建设不断推进的今天&#xff0c;随着技术的不断发展&#xff0c;从统计学、机器学习、深度学习&#xff0c;再到因果学习&#xff0c;以及最新的热门大模型方向&#xff0c;九章云极DataCanvas始终紧贴最前沿的、最能助力企业和落地实践的方向&#xf…

合伙企业的优缺点是什么

合伙企业的优缺点是什么 一、合伙企业的优点 合伙企业在资本扩张方面较个人独资企业更有优势。个人独资企业仅有一个投资人&#xff0c;尽管存在整个家庭财产成为个人独资企业资本来源的情形&#xff0c;但该类企业资本规模相对较小、抗风险能力较弱。为扩张资本&#xff0c;单…

通过U盘:将电脑进行重装电脑

目录 一.老毛桃制作winPE镜像 1.制作准备 2.具体制作 下载老毛桃工具 插入U盘 选择制作模式 正式配置U盘 安装提醒 安装成功 具体操作 二.使用ultrasio制作U盘 1.具体思路 2.图片操作 三.硬盘安装系统 具体操作 示例图 ​编辑 一.老毛桃制作winPE镜像 1.制作准…

基本数据类型变量间的运算规则、基本数据类型与String的运算

目录 一、自动类型提升 二、强制类型转换 三、基本数据类型与String的运算 1 字符串类型&#xff1a;String 2 运算规则 在Java程序中&#xff0c;不同的基本数据类型&#xff08;只有7种&#xff0c;不包含boolean类型&#xff09;变量的值经常需要进行相互转换。转换的方…

产品原型设计软件 Axure RP 9 mac支持多人写作设计

axure rp 9 mac是一款产品原型设计软件&#xff0c;它可以让你在上面任意构建草图、框线图、流程图以及产品模型&#xff0c;还能够注释一些重要地方&#xff0c;axure rp汉化版可支持同时多人写作设计和版本管理控制&#xff0c;这款交互式原型设计工具可以帮助设计者制作出高…

playbook变量的使用(二)

接上一章&#xff1a; 内置变量 变量的过滤器 31.9 内置变量hostvars hostvars用来显示指定主机的 fact变量,用法如下。 1 hostvars[ 主机名 ].键值 此变量一般用于&#xff0c;当某个play的 hosts 中只写了A主机组&#xff0c;但是同时想在此play中显示B 主机组中的信息,这…

Gradle中 Implementation 与API 声明依赖方式的对比

在Gradle中&#xff0c;implementation和api是声明依赖的两种方式&#xff0c;它们在如何暴露依赖关系方面有所不同&#xff1a; Implementation: 当一个模块使用implementation声明依赖时&#xff0c;该依赖仅对声明它的模块可见。这意味着该依赖对于该模块的消费者是隐藏的。…

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#…

如何通过ssh管道传输文件到ubuntu

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 如何在window系统中&#xff0c;通过ssh将指定的文件传输到ubuntu中呢&#xff1f; 比较常用的有以下种方式&#xff1a; 共享文件夹借助工具&#xff0c; FileZillaMobaxtermWinSCPXshell XFTP samba互传PuTTY pscp 今天主要…

【Mode Management】CanSM详细介绍

1. Introduction and functional overview AUTOSAR BSW栈为每个通信总线指定一个总线特定的状态管理器。CANSM实现CAN总线的数据流控制。CanSM隶属于通信服务层。CanSM和通信硬件抽象层以及系统服务层交互。 CanSM只用用于控制CAN通信。CanSM的任务就是操作CanIf模块去控制一个…

Python中abstractmethod的使用教程

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;抽象类和抽象方法提供了一种强制子类实现特定方法的机制。abstractmethod是abc&#xff08;Abstract Base Classes&#xff09;模块中的一部分&#xff0c;它允许定义抽象方法&#xff0c…

阿赵UE学习笔记——3、常用界面窗口

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。继续学习虚幻引擎&#xff0c;这次介绍的是编辑器的常用界面窗口。 一、视口 这个视口的概念&#xff0c;可以体现出UE对于多屏幕同时显示是多么的友好。我们开发游戏的时候&#xff0c;一般都会同一台电脑用2个或者以上显示器…

Docker的安装和使用

目录 安装Docker 安装yum工具 更新本地镜像源 安装docker 启动docker 关闭防火墙 docker启动命令 配置镜像加速 docker的使用 拉取nginx 查看本地镜像 把镜像文件nginx导出成tar文件 查看是否导出成功 ​编辑 删除本地镜像nginx:latest 导入镜像文件nginx 拉取…

算法基础之快速幂求逆元

快速幂求逆元 核心思想&#xff1a; 逆元&#xff1a; 逆元 ap-2 mod p #include<iostream>#include<algorithm>using namespace std;typedef long long LL;LL pmi(int a,int b,int c){LL res 1;while(b){if(b & 1) res res * a %c;b >> 1;a (LL)…

java定义三套场景接口方案

一、背景 在前后端分离开发的背景下&#xff0c;后端java开发人员现在只需要编写接口接口。特别是使用微服务开发的接口。resful风格接口。那么一般后端接口被调用有下面三种场景。一、不需要用户登录的接口调用&#xff0c;第二、后端管理系统接口调用&#xff08;需要账号密…

基于vue与three.js,监听FPX(Stats类使用)

第一步&#xff0c;引入stats类并new出来 import Stats from three/examples/jsm/libs/stats.module.js; data(){return {stats : new Stats(),} } 第二步&#xff0c;添加dom mounted() {this.init3D();this.animate();window.addEventListener("keydown", this.…