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

news2024/11/24 14:24:08

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


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

输入格式:

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

(很有意义的一道题)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Earth Engine】协同Sentinel-1/2使用随机森林回归实现高分辨率相对财富(贫困)制图

目录 1 简介与摘要2 思路3 效果预览4 代码思路5 完整代码6 后记 1 简介与摘要 最近在做一些课题&#xff0c;需要使用Sentinel-1/2进行机器学习制图。 然后想着总结一下相关数据和方法&#xff0c;就花半小时写了个代码。 然后再花半小时写下这篇博客记录一下。 因为基于多次拍…

二叉搜索树(AVL树,红黑树)+封装

就像学习其他的东西一样&#xff0c;首先我们要知道二叉搜索树的作用和定义是什么&#xff01; 首先顾名思义&#xff0c;二叉搜索树肯定是被用来为搜索服务的数据结构。 并且它的搜索效率可以达到logN,也就是一百万的数据也只用查找几十次&#xff08;AVL树可以控制在20次左…

日常工作中常用的抓包工具都有哪些呢?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

电子合同的分类有哪些?

1、从电子合同订立的具体方式的角度&#xff0c;可分为利用电子数据交换订立的合同和利用电子邮件订立的合同&#xff1b; 2、从电子合同标的物的属性的角度&#xff0c;可分为网络服务合同、软件授权合同、需要物流配送的合同等&#xff1b; 3、从电子合同当事人的性质的角度…

使用Gitee中的CI/CD来完成代码的自动部署与发布(使用内网穿透把本地电脑当作服务器使用)

&#x1f4da;目录 &#x1f4da;简介:⚙️ 所需工具&#xff1a;&#x1f4a8;内网穿透配置&#x1f4ad;工具介绍✨命令安装&#x1f38a;配置Cpolar&#x1f573;️关闭防火墙&#x1f95b;防火墙端口放行规则&#xff08;关闭防火墙可以忽略&#xff09;&#x1f36c;小章总…

【python】作用域与闭包 || global与nonlocal

python作用域 其他语言的作用域&#xff1a;块级、函数、类、模块、包等由小到大的级别但是python没有块级&#xff08;if语句块、for语句块&#xff09;&#xff0c;所以if中定义的变量&#xff0c;相当于普通语句 >>> if True: # if语句块没有作用域x …

华为云之ECS云产品快速入门

华为云之ECS云产品快速入门 一、ECS云服务器介绍二、本次实践目标三、创建虚拟私有云VPC1.虚拟私有云VPC介绍2.进入虚拟私有云VPC管理页面3.创建虚拟私有云4.查看创建的VPC 四、创建弹性云服务器ECS——Linux1.进入ECS购买界面2.创建弹性云服务器(Linux)——基础配置步骤3.创建…

如何使用 templ 在 Go 中编写 HTML 用户界面?

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 简介 templ 是一个在 Go 中编写 HTML 用户界面的语言。使用 templ&#xff0c;我们可以创建可呈现 HTML 片段的组件&#xff0c…

基于改进YOLOv7的绝缘子缺陷检测算法

摘要 现有的检测方法面临着巨大的挑战&#xff0c;在识别绝缘子的微小缺陷时&#xff0c;针对输电线路图像与复杂的背景。为保证输电线路的安全运行&#xff0c;提出一种改进的YOLOv 7模型&#xff0c;以提高检测结果。 首先&#xff0c;基于K-means对绝缘子数据集的目标盒进…

Redis“垃圾”过期死键管理与优化

【作者】付磊 Redis死键的定义不尽相同&#xff0c;通常有两种&#xff1a; 写到Redis里后&#xff0c;由于过期时间过长或者压根没有过期时间&#xff0c;加之长期不访问&#xff0c;这类key可以被称为死键。 明明已经过了过期时间&#xff0c;但还占用Redis内存&#xff08…

利用tf-idf对特征进行提取

TF-IDF是一种文本特征提取的方法&#xff0c;用于评估一个词在一组文档中的重要性。 一、代码 from sklearn.feature_extraction.text import TfidfVectorizer import numpy as npdef print_tfidf_words(documents):"""打印TF-IDF矩阵中每个文档中非零值对应…

Nacos-服务发现与配置管理v1.0

Nacos - 服务发现和配置管理 教学目标 1&#xff09;能够理解微服务架构的特点 2&#xff09;能够理解服务发现的流程 3&#xff09;能够说出Nacos的功能 4&#xff09;掌握Nacos的安装方法 5&#xff09;掌握RESTful服务发现开发方法 6&#xff09;掌握Dubbo服务发现开…

AIGC绘画关键词 - 神兽类(一)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

JNI学习(二)

静态注册 接着上篇博客学习 JNI函数 JNIEXPORT void JNICALL Java_com_example_jnidemo_TextDemo_setText(JNIEnv *env, jobject this, jstring string){ __android_log_print(ANDROID_LOG_ERROR, "test", "invoke set from C\n");char* str (char*)(*e…

每日一题——链表的回文结构

链表的回文结构 1. 题目描述 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。 给定一个链表的头指针A&#xff0c;请返回一个bool值&#xff0c;代表其是否为回文结构。保证链表长度小于等于900。 测试…

SpringBoot集成swagger-ui

1.引入依赖&#xff1a; <!--swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.sprin…

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

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

查找算法——二分查找

笔记&#xff1a;二分查找算法 | 数据结构与算法 系列教程&#xff08;笔记&#xff09; 题目描述 请对一个 有序数组 进行二分查找 {1,8, 10, 89, 1000, 1234}&#xff0c;输入一个数看看该数组是否存在此数&#xff0c;并且求出下 标&#xff0c;如果没有就提示「没有这个数…

前端ICON库

前端ICON库 1.mingcute mingcute 2.lordicon lordicon 3.字节iconpark&#xff08;推荐&#xff09; 字节iconpark 4.iconbuddy iconbuddy.app/ 5.商标寻找youicons 免费下载数百万个徽标以获得设计灵感 | YouIcons.com 还有一堆工具

一键转换,将HTML智能转换为PDF,轻松解决文档转换需求

在数字时代&#xff0c;HTML网页是我们获取信息的主要来源之一。然而&#xff0c;有时候我们可能需要将网页内容以PDF格式保存&#xff0c;以便于离线阅读、打印或分享。这时&#xff0c;将HTML转换为PDF就变得尤为重要。 首先&#xff0c;我们要进入首助编辑高手主页面&#x…