爆刷PAT(甲级)——之链表专题【1032】【1052】【1097】【1133】——一个排序法应对大部分链表题

双目立体匹配算法:SGBM SGBM(Semi-Global Block Matching)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的优缺点,提出了一种折中的方法,既能保证视差图的质量,又能降低计算复杂度。 阅读详情

之前几次PAT,好几次遇见了链表题——将数据以“节点”的形式给出,以“本地址addr”、“值value”、“下一个地址next”的数据形式,让编码者自行逻辑链接操作。由于平时没有刻意关注过,结果实战时按照模拟的方法去做题,要么思维混乱、耗费很多的时间写代码,要么晦涩地模拟出一坨屎。

我个人之前,首先是将“地址”信息作为“字符串”读入;其次,节点间的联系使用map把它映射成数字id;最后,再按照数字id重新遍历,构建以数字id为下标索引的新数组静态链表,就可以按照数据结构里的链表形式进行链表的操作了。

如何将“虽然题目提供的节点是有链表关系的”方便地转换成“平时习惯的在程序上直接处理的链表关系”?我的这种map来map去的方法,特别绕脑子不说,写代码各种bug,而且在删除、修改节点的时超级麻烦……(ㄒoㄒ)

除上述之外,PAT题目尾节点的next是-1,那么在使用map的时又要讨论一下;因为我是按字符串读入的,-1与“-1”的处理也要注意;以及map要反复更新等等……

我一直认为“模拟题”,如果代码写的不够快,是思维不够迅捷、逻辑链不够强才会被绕晕(虽然确实是)。但总觉得自己的方法不对啊,今天抽出时间把这类的题目解法看一下,眼前一亮,看见了一种通用的链表题解决方法——排序法!

简要概述PAT链表题的思路:所有节点给出的地址都是在10e5范围内的正整数,所以我们直接开这么大的结构数组进行索引。将题目提供的 (Address) (Key) (Next) 信息直接存放在node[Address]之中,按照链表顺序遍历链表后,各个节点按链表顺序进行id编号,最后将整个数组基于id排序就可以将乱序的链表节点有序化!而不同的链表题,要做的只是对排序的条件微调罢了!另外要注意的是,为了使得没有数据的数组元素在排序过程中不会导致干扰,要对节点数组进行初始化,例如设置id默认无穷大。

那么我就按照我的做题顺序来写详细代码过程吧,分别是【1097】-【1032】-【1052】-【1133】。

其中PAT的四道题是在这位博主的博文中注意到的: https://www.cnblogs.com/whale90830/p/11474333.html

参考了柳婼的各题的解法,刷了一下PAT的题【1032】Sharing (25)、【1052】Linked List Sorting (25)、【1097】Deduplication on a Linked List (25)、【1133】Splitting A Linked List (25),来检验一下可行度。

      

 

1、【1097】Deduplication on a Linked List (25)——节点去重

这题我按照自己的模拟+map的思路写了40分钟,不但bug极多而且删除节点环节没办法跑。学习了柳婼的代码以后学习到了“排序法”。而我觉得,如果这道题目的排序法能够理解,后面的3道题就绝对不是问题了。  

题意:给出N个链表节点与起始地址,节点形式按照 (Address) (Key) (Next) 。题目要求将N个节点中,保留首个出现的节点将后续时出现的绝对值相等的节点删去,并单独成另外的链表。节点形式按照 (Address) (Key) (Next) ,在结尾输出这两条链表。

思路:首先将链表节点存入结构体数组中,然后遍历链表,如果这个节点是第一次出现,那么更新标记,以及更新id为节点号 i ;如果这个节点的绝对值已经出现过,那么就需要删除并插入第二张表,于是!!!我们就把这个节点更新为 i+maxn !!!然后按照上文提到的,将整个节点数组node按照id进行排序,就可以得到“按照链表顺序的”且“原表在前,被删除的节点构成的新表在后的”节点顺序了,直接按序输出即可!

这个删除节点的 id赋值为 i+maxn 的优点就在于,由于i变量在每个节点都会+1操作,那么被删除的节点之间,后删除的节点的id必然比前删除的节点要大;而保留的节点与被删除的节点之间,由于被删除的节点的id多了常量 maxn ,所以被删除的节点的id必然要比没有删除的节点要大。在基于各节点的id变量进行sort之后,数组就会如理想的那般有序了!

 

Code:

#include<bits/stdc++.h>
using namespace std;
#define inf 100009
#define INF 0x3f3f3f3f
struct Node
{
    int id=2*inf;
    int addr;
    int value;
    int next;
    bool operator<(const Node& t)const
    {
        return id<t.id;
    }
}node[inf];
int book[inf];
int main()
{
    int addr,n,i;
    memset(book,0,sizeof book);//init
    cin>>addr>>n; //read Data
    for(i=0;i<n;i++)
    {
        int t;
        cin>>t;
        node[t].addr=t;
        cin>>node[t].value>>node[t].next;
    }
    i=addr; //Traverse the list
    int num1=0,num2=0;//num1是没删掉的,num2是删掉的
    while(i!=-1)
    {
        if(book[abs(node[i].value)])
            node[i].id=(num2++)+inf;
        else
        {
            node[i].id=num1++;
            book[abs(node[i].value)]=1;
        }
        i=node[i].next;
    }
    sort(node,node+inf);       //sort
    for(i=0;i<num1+num2;i++)    //output
        if(i!=num1-1&&i!=num1+num2-1)printf("%05d %d %05d\n",node[i].addr,node[i].value,node[i+1].addr);
        else printf("%05d %d -1\n",node[i].addr,node[i].value);
    return 0;
}

如果我的代码不够清晰,非常惭愧,可以看看柳婼的写法,更加简明扼要。

 

2、【1032】Sharing (25)

       接下来的三道题都是基本的练手了。

题意:给出N个链表节点与起始地址,节点形式按照 (Address) (Key) (Next) 。题目表示,有两个字符串,都按照链表的形式单字符给出,这两个字符串可能会有相同后缀,即有相同的节点部分。要求在N个节点中,找出重叠部分的首个节点地址,没有输出-1。

思路:首先可以按照上文提到的,基于结构数组的静态链表法,把链表存起来。这题吧我考408的时候就看过了。俩字符串长的那根先走几步,使得剩下的部分和短字符串一样长,接下来俩人手拉手一起走,遇见一个节点是相同的就找到了。如果走到头没找到那就没咯。

坑点: 本题判断是不是相同的节点,看的可不是值是否相同,而是节点的地址是否相同!

 

Code:

#include<bits/stdc++.h>
using namespace std;
#define inf 100009
#define INF 0x3f3f3f3f
struct Node
{
    int add,next;
}node[inf];

int main()
{
    int s1,s2,n,i,j;
    cin>>s1>>s2>>n; //read Data
    for(i=0;i<n;i++)
    {
        int t;
        char c;
        cin>>t;
        node[t].add=t;
        cin>>c>>node[t].next;
    }
    int len1=0,len2=0; //get the length of the two lists
    i=s1;
    while(i!=-1)
    {
        len1++;
        i=node[i].next;
    }
    i=s2;
    while(i!=-1)
    {
        len2++;
        i=node[i].next;
    }
    int len=abs(len1-len2);
    if(len2>len1)swap(s1,s2);//let the s1 be the longer one
    for(i=0,j=s1;i<len;i++,j=node[j].next); //move the s1 of the list1
    s1=j;
    while(s1!=-1)//move two lists together
    {
        if(s1==s2)
            break;
        s1=node[s1].next;
        s2=node[s2].next;
    }
    if(s1==-1)printf("-1\n");//output
    else printf("%05d\n",s1);
    return 0;
}

 

3、【1052】Linked List Sorting (25)

这题就是妥妥的模板题了!

题意:给出N个链表节点与起始地址,节点形式按照 (Address) (Key) (Next) 。题目要将链表排个序,然后节点形式按照 (Address) (Key) (Next) ,在结尾输出这链表。

思路:这题按照“排序法”妥妥的模板题啊。首先可以按照上文提到的,基于结构数组的静态链表法,把链表存起来。然后按照链表顺序遍历链表,并记录节点的id值,将整个数组基于id排序就可以将乱序的链表节点有序化!基操,非常好理解。

坑点: 1) Emmm…… 没错,有一些节点不在链表上,也接设立一个标记flag或者id+maxn都可以的。

2)可能会0输出,这个时候输出"0 -1\n"才行,不要输出多咯!

 

Code:

#include<bits/stdc++.h>
using namespace std;
#define inf 100009
#define INF 0x3f3f3f3f
struct Node
{
    int add,next;
    int value=INF;
    int flag;//是否是链表中的有效节点,默认0
    bool operator< (const Node& t)const //比较函数
    {
        if(flag!=t.flag)return flag>t.flag;//1优先,即在链表的优先排序
        return value<t.value;
    }

}node[inf];

int main()
{
    int n,s;
    int i,j,num=0;
    cin>>n>>s;//read Data
    for(i=0;i<n;i++)
    {
        int t;
        cin>>t;
        node[t].add=t;
        cin>>node[t].value>>node[t].next;
    }
    while(s!=-1)//遍历链表,并标记是否on list
    {
        node[s].flag=1;
        s=node[s].next;
        num++;
    }
    sort(node,node+inf);//sort
    if(!num)//如果全是链表外的节点,无输出——这里不注意就会有个点WA
    {
        printf("0 -1\n");
        return 0;
    }
    else printf("%d %05d\n",num,node[0].add);
    for(i=0;i<num-1;i++)//output
        printf("%05d %d %05d\n",node[i].add,node[i].value,node[i+1].add);
    printf("%05d %d -1\n",node[i].add,node[i].value);

    return 0;
}

 

4、【1133】Splitting A Linked List (25)

题意:给出N个链表节点与起始地址,节点形式按照 (Address) (Key) (Next) 。题目还给了一个正数K,将节点里的数据,如果是负数就要在前面,如果是 [0,K] 之间的数就要在中间,如果大于K就要在最后。然后节点形式按照 (Address) (Key) (Next) ,在结尾输出这链表。

思路:这不和上面一样嘛,大不了就是排序条件不一样呗。首先可以按照上文提到的,基于结构数组的静态链表法,把链表存起来。然后按照链表顺序遍历链表并记录id顺序,如果是负数的节点,标记为rank=1;如果是区间 [0,K] 的节点,标记为rank=2;如果是大于K,标记为rank=3;排序的时候按照标记来排序,如果标记相同按id顺序来。微调一下排序条件而已,问题不大,没有数据的节点就设置rank=4、5、6…都行啦~还是“排序”作为灵魂。

坑点: 没错,有一些节点不在链表上。也设立一个标记flag什么的。【链表题的坑点就是这种

 

Code:

#include<bits/stdc++.h>
using namespace std;
#define inf 100009
#define INF 0x3f3f3f3f
struct Node
{
    int addr,value,next;
    int id,level=3; //默认3,即无数据情况
    int flag;//是否在list中
    bool operator<(const Node&t)const
    {
        if(flag!=t.flag)return flag>t.flag;//On list 优先
        if(level!=t.level)return level<t.level;//符合题目规则的优先
        return id<t.id;//其次按照原来的顺序
    }
}node[inf];
int main()
{
    int n,k,s,i,j;
    scanf("%d%d%d",&s,&n,&k);//read Data
    for(i=0;i<n;i++)
    {
        int t;
        scanf("%d",&t);
        node[t].addr=t;
        scanf("%d%d",&node[t].value,&node[t].next);
        if(node[t].value<0)node[t].level=0; //负数
        else if(node[t].value<=k)node[t].level=1;// [0,k]之间
        else node[t].level=2; //大于k
    }
    i=s;//遍历链表,判断是否在链表上
    j=1;
    int num=0;
    while(i!=-1)
    {
        node[i].id=j++;
        node[i].flag=1;//The node is on list.
        i=node[i].next;
        num++;//The number of the nodes which are on list.
    }
    sort(node,node+inf);//sort
    for(i=0;i<num-1;i++)//output
        printf("%05d %d %05d\n",node[i].addr,node[i].value,node[i+1].addr);
    printf("%05d %d -1\n",node[i].addr,node[i].value);
    return 0;
}

这里还插入一段小插曲——我还翻出了去年自己用 模拟法+map 过的此题,写的那叫一个销魂苦涩,都是AC的代码,但是我举得还是排序法Nice啊,放到这里对比一下,清晰可见呐简直了!

苦涩的含泪Code:

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define inf 100009
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)

int n,s,g,k;
unordered_map<int,int>add2pos;
struct Node
{
    int add,value,next;
    int negtive;
    int minK;
}node[inf];
int book[inf];
int isList[inf];
int e[inf];//链表顺序
int main()
{
    int i,j;
    int s1;
    scanf("%d%d%d",&s1,&n,&k);
    loop(i,0,n)e[i]=-1;
    loop(i,0,n)
    {
        scanf("%d%d%d",&node[i].add,&node[i].value,&node[i].next);
        if(node[i].add==s1)s=i;//定起点
        if(node[i].next==-1)g=i;//定终点
        if(node[i].value<0)node[i].negtive=1;
        if(node[i].value<=k)node[i].minK=1;
        add2pos[node[i].add]=i;
    }
    //串链表,e[i]表示第i个结点的索引
    i=s;j=0;
    while(1)
    {
        isList[i]=1;
        e[j++]=i;
        if(i==g)break;
        i=add2pos[node[i].next];
    }
    queue<Node>q;
    while(!q.empty())q.pop();
    loop(i,0,n)
    {
        j=e[i];
        if(isList[j]==1&&!book[i]&&node[j].negtive)
        {
            q.push(node[j]);
            book[i]=1;
        }
    }
    loop(i,0,n)
    {
        j=e[i];
        if(isList[j]==1&&!book[i]&&node[j].minK)
        {//printf("debuggggg   :  %d %d\n",j);
            q.push(node[j]);
            book[i]=1;
        }
    }//printf("debuggggg   :  %d\n",q.size());
    loop(i,0,n)
    {
        j=e[i];
        if(isList[j]==1&&!book[i])
        {
            q.push(node[j]);
            book[i]=1;
        }
    }//printf("debuggggg   :  %d\n",q.size());
    Node t=q.front();q.pop();
    printf("%05d %d ",t.add,t.value);
    while(!q.empty())
    {
        Node &t=q.front();
        q.pop();
        printf("%05d\n%05d %d ",t.add,t.add,t.value);
    }
    printf("-1\n");
    return 0;
}

 

 

 

好啦,希望本文能起到将PAT链表题如何击破的作用啦~继续努力,动手之后都是小问题!

FAA和EASA在机载电子硬件适航中的发展历史与差异 FAA和EASA在机载电子硬件的适航审查中虽然存在一些差异,但通过近年来的合作,这些差异正在逐步缩小。两者通过。 阅读详情

相关推荐

2024高校网络安全管理运维赛题目--复现+题目+wp

官方writeup集思广益比较好的备份。

书山有路勤为径,学海无涯苦作舟 1321

bool operator==(const T& t) const,关系运算符重载

基本定义: bool operator ==( )可以分为——bool operator ==( const bool& other)、bool operator ==( const T& other), 其中T代表类型; 运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号> (<参数表>) { <函数体> } 关系运算符重载: bool operator == (const T& )..

weixin_42322256的博客 6197

squidpy 教程 1:在 AnnData 和 Squidpy 中导入空间数据

这些是 10x Genomics Visium 的 Space Ranger 输出提供的 keys,因此是第一个被采用的 keys。在这种情况下,我们假设空间坐标与像素具有相同的比例,因此我们将该值设置为 1。为此,我们将使用模拟数据集,并通过示例展示您应该注意的重要细节,以便利用 AnnData-Scanpy-Squidpy 生态系统的全部功能。并不是绝对必要的,但会节省您大量的输入,因为它是 Squidpy 和 Scanpy 的默认值。正如你所看到的,空间坐标被缩小了,图像被“放大”了。

🧑‍🎓 博士研究生在读 🔬 分享生物信息学、神经生物学方面的知识 💬 合作请在后台留言 2255

结构体内嵌比较函数bool operator < (const node &x) const {}

关于结构体内嵌比较函数: 一般情况下: struct node { int l,r; bool operator <(const node &a)const{ return r < a.r; } }a[maxn]; 直接写比较函数是裸的r表示当前的值,如果r<a.r,那么就是从小到大排序,但是优先队列的是相反的。 sort默认为从小到大排序,优先队列默认为从大到小。 struct node { int l,r;

Li5566123的博客 6774

机器人关节电机发热难题:从工程化角度拆解热管理解决方案(下)

摘要:本文系统分析了机器人关节电机与驱动系统的热管理方案,重点解决局部热点问题。针对不同功率场景提出了热管/均热板散热(适用于中小功率)和液冷散热(适用于高功率)的具体实施方案,详细比较了结构参数、材料选择、安装工艺和散热效果。特别强调了电机-驱动协同热管理的重要性,提出"工况联动+热路径共享"的核心理念,包括一体化散热结构设计和动态控制策略。最后介绍了热仿真与测试验证方法,确保方案的有效落地。通过系统级热管理,可显著降低温升(热点区域降温30-60℃),同时优化体积和能耗。

bother3000的博客 3328

探针卡技术演进:从金线微针到MEMS探针的Wafer Sort革命

本文探讨了探针卡技术从传统金线微针到MEMS探针的演进,及其对晶圆测试(Wafer Sort)的革命性影响。随着芯片焊垫间距进入45微米以下,MEMS技术凭借其超高精度、超长寿命和卓越的信号完整性,成为应对高密度、高速及3D IC测试挑战的关键,显著提升了测试效率与稳定性。

lstm7chronicler的博客 365

C++ 优先队列

优先队列 优先队列(priority queue)亦即数据结构中的堆,是计算机科学中一类特殊的数据结构的统称。在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待长时间才能结束,或某些不短小,但具有重要性的作业,同样应当具有优先权。优先队列即为解决此类问题设计的一种数据结构。优先队列(堆)通常是一个可以被看做一棵树的数组对象。 优先队列中的常用函数: em

倚世独殇 2507

从星形到三角形:永磁同步电机FOC+SVPWM控制的相位偏移与扇区重构

本文深入探讨了将FOC+SVPWM控制方案从星形接法永磁同步电机移植到三角形接法时遇到的核心挑战。文章重点解析了由绕组连接方式差异导致的30度相位偏移问题,并详细阐述了如何为此重构扇区判断逻辑、矢量作用时间计算以及电流采样变换,为工程师提供了从理论到实践的完整移植指南。

ujm5678901的博客 544

uva11729

uva 11729 任务执行时间长的先交代 #include #include #include #include #include #include using namespace std; #define MAXN (1000+5) struct node{ int b, j; bool operator <(const node &a)const{

dreams_fly_oyzx的博客 304

桌面运维工程师面试题详解(一)

桌面运维工程师面试题详解(一)

jks212454的博客 1424

PD详解 扩展消息——Source_Capabilities_Extended Message

PD的协议层分为控制消息,数据消息还有扩展消息,今天大师匈讲一下扩展消息中的source_cap_extended。这个消息在扩展消息中算是比较关键的东西。 扩展消息中的source_cap_extended 大师匈先上图,然后逐一解释; 上面的图表说了source_cap_ext中包含了哪些内容。 我们注意到在source_cap扩展消息中是以字节为单位的,并不是像source_cap中以一个object为单位,当然有注意到PD标准spec中说明的扩展消息的话,那里有说明,在header之后的字节

大师匈的博客 3516

结构体内嵌比较函数bool operator * (const node *x) const {}

struct node { int l,r; bool operator <(const node &a)const{ return r < a.r; } }a[maxn]; 直接写比较函数是裸的r表示当前的值,如果r<a.r,那么就是从小到大排序,但是优先队列的是相反的。 sort默认为从小到大排序,优先队列默认为从大到...

chen_zan_yu_的博客 7854

绘制Winform动态折线图,LiveCharts如何打造数据可视化神器?

在C# Winform应用程序中,使用LiveCharts库来创建动态、美观的折线图不仅能够提升用户体验,还能直观展示数据趋势。下面,我们将通过一个详尽的示例,展示如何在Winform项目中集成LiveCharts并绘制折线图。:在Visual Studio中,选择“文件” > “新建” > “项目”,然后选择“Windows Forms 应用(.NET)”模板。LiveCharts的强大之处在于其高度的可定制性,你可以根据需求调整颜色、动画效果、交互方式等,让图表更加符合你的应用需求。

java专栏 1683

牛客练习赛43 题解

这场打的有点梦游...... B.Tachibana Kanade Loves Probability 思路:我们模拟一下分数除法 a/b 发现是不停的 :a*10,a%=b,然后根据这点直接快速幂求出第k1为数是多少就行。 #include<bits/stdc++.h> #define ll long long using namespace std; ll ksm(ll r...

ccsu_cat 406

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[Cogs]-1032-最小交换排序

奇♂怪的题,我用了丧心病狂的方法,有必要写下题解 最小交换排序 【问题描述】     小x最近切了一道很水的排序题,但是在AC之后,他想到了一个问题: 给定n个不相等的整数,将其按从小到大排序,你每次可以对任意一对数进行交换,问最少的交换次数是多少? 【输入】 第一行:一个整数n 第二行:n个用空格隔开的正整数ai,-2^31 【输出】 一

sqyon的算法博客BnK&BF^2tp%T 790

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pat 链表专题(1)做题总结

PAT 链表专题 (1) 今天写了两道题,讲道理 这两道题看上去 我都觉得非常简单 但是 事实告诉我 这两道题 我花了许多时间 而且还没做对 [这是第一题A1032 Sharing](https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920) ...

weixin_44142027的博客 322

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PAT题目的单链表题目

PAT题目的单链表题目 ​ PAT的单链表基本都是静态链表。可以当成常规的单链表来做,会比较符合出题人的意图。但也有一些别的办法来完成静态链表的题目。 1097 Deduplication on a Linked List (25分) Given a singly linked list L with integer keys, you are supposed to remove the no...

fire_for_you的博客 299

PAT乙级练习题1025 反转链表

题目: 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。 输入格式: 每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤105)、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。 接

Snapdragon123的博客 394

PAT 链表去重

题目说明: 给定一个带整数键值的链表L,你需要把其中绝对值重复的键值结点删掉。即对每个键值K,只有第一个绝对值等于K的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定L为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。 输入格式: 输入在第一行给出 L 的第一个结点的地址和一个正整数N(≤1...

weixin_44226886的博客 584

【PAT乙级】链表类题目的套路总结

思路 我们可以采用结构体的方法定义静态链表,但是在算法考试中,考虑到程序运行速度和代码简洁程度,我们通常使用两个数组data[]、next[]来表示当前结点存放的值和当前结点的下一个结点的地址值,当前结点的地址值作为数组下标(类似散列表映射的思想);同时我们还需要定义一个数组list[]来根据不同要求的顺序存放的当前结点的地址值……听起来可能有点绕口。到那时这种方法确实能大大减少代码量,建议经过几次的认真揣摩和实践去掌握这种定义方式。 步骤 定义三个数组、输入三种值 int data[maxn], n

Welcome_To_CJ's_Blog 474

PAT链表题简单总结

  步骤1:定义静态链表。其中结点性质由int型变量order定义,表示结点在链表中的序号(从0开始),其中无效结点为maxn 步骤2:初始化。令order的初值均为maxn,表示初始时所有结点都为无效结点 步骤3:由题目给出的链表首地址begin遍历整条链表,并记录每个有效结点在链表中的序号,即给order赋值,同时计数有效结点的个数cnt。之后为了方便书写,把cnt赋给n 步骤4:对结...

zjykshen的博客 488

爆刷PAT(甲级)——之【1139】 First Contact (30 分)——模拟+两个细节

题意:N个小朋友,告诉你他们的朋友关系。K次询问,对每次询问回答有几种告白方式。告白的方法是——A喜欢B,那么A要找邻接点C,C找邻接点D,D告诉他的朋友B实现告白。要求A和B同性别,C和D同性别,A和B不一定。人数N小于300,询问K小于100.输出所有可行的C和D,按照升序输出。 思路:思路可以想到,列举一下A的所有朋友,列举一下B的所有朋友,然后看看他们各自的朋友有几对朋友即可。但是我写的...

Hide_in_Code 1727

爆刷PAT(甲级)——之【1014】 Waiting in Line (30)(30 分)——队列的使用

题意: 银行柜台有N个,每个柜台可以独立干活排队。     每个柜台后面黄线内可以排队,可以排M个人。如果人满了,要么去别的队伍,要么去旁边等着。     一共有K个客户。每个客户自行去排队,客户排队的时候,会选择最快的队伍!每个客户需要Ti的时间处理业务。队伍前面的客户业务办完了,后面的客户办。     银行早上8点开始上班,下午17点关门。     输入Q此询问,每次输出特定的客户,什么时候...

Hide_in_Code 1506

爆刷PAT(甲级)——之【1029】 Median(25 分)——队列问题+内存优化

PS:如果你看完了下面的内容,那很不幸,很多都是没必要的。。。因为我才发现,long int 就是int !(可恶 也就是说下面关于内存的什么long long 好像都是我YY出来的,因为数据类型题目已经保证了是int ...... 惭愧惭愧,博客也懒得改了,以下为原答案: 题意:给两个有序序列,输出两个序列合并以后的中位数。 难点:我很惭愧,这题没有用到高深的算法,没有用到优秀的数据结构,...

Hide_in_Code 1345

爆刷PAT(甲级)——之【1153】 Decode Registration Card of PAT (25 分)——模拟细节题(如何解决超时问题!)

此题是去年12月份甲级PAT没有拿到全分的题目。当时最后两个点没有过,所以最可能拿满分的一次机会白白流失掉了。 当初最后两个点是因为超时,一时半会没想到如何去优化。回来以后也没有花时间再去解决这个TLE问题。 昨天晚上突然想到这题,抽时间写了一下,花了2个小时还是最后两个点没有过,百思不得其解。 今天解决了这个问题,觉得有毒。 网上各大博客都没有着重点出如何解决这个TLE(超时)问题,也很...

Hide_in_Code 996

爆刷PAT(甲级)——之【1145】 Hashing - Average Search Time(25 分)——Hash

艰难的英语单词: Quadratic probing    平方探测 increments    英 ['ɪnkrəmənts]        n.增量; 题意:给一串数,把它们按照 num%v 哈希,如果有冲突就按照平方探测法正向解决冲突,哈希不进去就输出失败。 然后给一部分刚刚的数,判断它们是否在哈希入了表内。并最后输出总共进行了多少次查询。 难点:其中好几个概念都不是很清楚——平方...

Hide_in_Code 801
上一篇: 爆刷PAT(甲级)——之【1119 】Pre- and Post-order Traversals (30 分)——先序后序建立中序遍历
下一篇: 【VMware的坑爹之路】VMware复制文件卡死死机;无法访问网络地址“*:\“
仰天倀笑
博客等级 码龄10年 313粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值