PAT (Advanced Level) Practice 1133 Splitting A Linked List

1133 Splitting A Linked List(25 分)

Given a singly linked list, you are supposed to rearrange its elements so that all the negative values appear before all of the non-negatives, and all the values in [0, K] appear before all those greater than K. The order of the elements inside each class must not be changed. For example, given the list being 18→7→-4→0→5→-6→10→11→-2 and K being 10, you must output -4→-6→-2→7→0→5→10→18→11.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤10​5​​) which is the total number of nodes, and a positive K (≤10​3​​). The address of a node is a 5-digit nonnegative integer, and NULL is represented by −1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer in [−10​5​​,10​5​​], and Next is the position of the next node. It is guaranteed that the list is not empty.

Output Specification:

For each case, output in order (from beginning to the end of the list) the resulting linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218

Sample Output:

33218 -4 68237
68237 -6 48652
48652 -2 12309
12309 7 00000
00000 0 99999
99999 5 23333
23333 10 00100
00100 18 27777
27777 11 -1

思路:开结构体直接记小于0,小于等于K大于0,大于K的部分,再分部输出。

注意可能不存在某个部分,最后要以-1结束

‘代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
struct node{
    int add,v,next;
    int now;
}lin[maxn],l[maxn],i[maxn],r[maxn];
int lcnt=0,icnt=0,rcnt=0;
int fid,N,K;
void check(int now)
{
    if(lin[now].v<0)l[lcnt++]=lin[now];
    else if(lin[now].v<=K)i[icnt++]=lin[now];
    else r[rcnt++]=lin[now];
}
int main()
{

    scanf("%d%d%d",&fid,&N,&K);
    int a,v,b;
    for(int j=0;j<N;j++)
    {
        scanf("%d%d%d",&a,&v,&b);
        lin[a].now=a;
        lin[a].v=v;
        lin[a].next=b;
    }
    int next=lin[fid].next;
    lcnt=0,icnt=0,rcnt=0;
    check(fid);
    while(next!=-1)
    {
        check(next);
        next=lin[next].next;
    }

    for(int j=0;j<lcnt;j++)
    {
        if(j<lcnt-1)
        printf("%05d %d %05d\n",l[j].now,l[j].v,l[j+1].now);
        else
        {
        	int pos=-1;
			if(icnt>0)pos=i[0].now;
			else if(rcnt>0)pos=r[0].now; 
			if(pos==-1)printf("%05d %d -1\n",l[j].now,l[j].v);
			else
            printf("%05d %d %05d\n",l[j].now,l[j].v,pos);
        }
    }
    for(int j=0;j<icnt;j++)
    {
        if(j<icnt-1)
            printf("%05d %d %05d\n",i[j].now,i[j].v,i[j+1].now);
        else{
        	int pos=-1;
        	if(rcnt>0)pos=r[0].now;
        	if(pos==-1)printf("%05d %d -1\n",i[j].now,i[j].v);
            else
			printf("%05d %d %05d\n",i[j].now,i[j].v,pos);
        }
    }
    for(int j=0;j<rcnt;j++)
    {
        if(j<rcnt-1)
            printf("%05d %d %05d\n",r[j].now,r[j].v,r[j+1].now);
        else
            printf("%05d %d -1\n",r[j].now,r[j].v);
    }
}

 

这是一个基于Delphi XE2的OpenCL控件。其中使用到了Khronos Group Inc.的CL.pas单元。 OpenCL的设计思路和OpenGL类似,对于大部分Delphi的设计者来说,非常不习惯,而且使用起来并不十分方便 设计这个TOpenCL控件的目的不是替代OpenCL的原生使用方式,而是为了开发者能够快速对OpenCL进行应用并且可以 用来测试性能和功能。 使用TOpenCL控件,可以象使用数据库控件那样方便的去调用OpenCL程序,不需要太多代码就可以运行一个OpenCL 的Kernel。这对于学习和深入研究OpenCL的性能有一个很好的铺垫。 使用OpenCL做并行计算的一个主要因素就是提高大数据量计算的速度,这和通常的业务处理类程序大不相同,因 此提升OpenCL的运行效率是至关重要的,本控件附带的Demo程序中,是对两个长度分别为8192和32的float数组,进行 一维卷积计算的。在选择不同的数据传递方式(如使用显存还是Host内存、使用只读方式还是可读写或者只写方式), 或者不同的Device(如在多核CPU上和GPU上运行Kernel程序)上运行,其效率相差是非常大的。 Demo程序中缺省的使用不显示获取结果的方式运行,缺省的数据传输是使用显存(CPU作为Device的时候,其实还 是系统内存)并Copy数据的方式,因此显示结果始终是0。当输出的参数传递方式改为直接使用系统内存指针的方式时, 不使用显示获取计算结果则是可以得到运算结果的。这些参数之间的差异,读者自行测试并仔细体会,通过调整,相信 可以得到最佳的运行方式。 Demo中包含了四个Kernel函数,分别是Convolution_Kernel_With_Barrier。这是一个带有同步函数Barrier的卷积 过程,并在卷积完成后,等待所有单元计算完毕,然后对结果进行微分(差商)处理,实际情况表明Barrier函数对GPU 的影响甚微,但如果使用CPU作为Device计算,则效率影响非常大,其耗时几乎和单核计算不相上下,估计是同步函数 在等候的过程中,引起了CPU对Catch竞争访问的结果吧。对这种情况,反倒不如拆分成两个Kernel进行单独计算,其累 积的计算时间基本上为两个独立Kernel耗时只和。 Differ_Kernel是单独进行微分计算的,是为了验证上面计算耗时结果的。 Convolution_Kernel是只进行卷积计算的,可以认为和Differ_Kernel前后执行,其结果应该和Convolution_Kerne- l_With_Barrier单独执行是一样的。 Convolution则是一个简单的计算过程,用来测试启动Kernel、等候数据等操作会占用的时间情况的。 OpenCL其实并不是想象中那么美妙,也不是想象中的那么复杂,但要使用好OpenCL,就必须认真的对待每个细节, 甚至到每一个函数调用或者if控制等,大家可以参考“http://hi.baidu.com/fsword73”,上面涉及到的很多方面,都是 可以提升Kernel运行效率的。 目前这个TOpenCL控件只是作者为了测试OpenCL运行效率编写的一个小的工具,作为一个测试工具或者技术积累阶段 的工具足矣,但在实际工程中,希望还是能够尽可能使用原生的调用方式,控件模式势必会带来一定的性能损失的,这是 无法克服的是一个实际情况,对于某些流式数据处理的计算而言,多次重复使用同一个Kernel对流式数据进行处理的,则 使用本控件应该不会造成太大的性能影响。 目前TOpenCL不支持多个Device同时工作,可以选择CPU、GPU或者APU作为首选设备, X86下运行正常,X64下运行仍有 问题,疑和cl.pas中对context等处理的方式不支持X64或者其他原因。 目前支持的OpenCL版本为1.2。控件没有考虑OpenCL和OpenGL协同工作的情况,需要做这方面应用或者测试的读者,请 自行处理。 一下是控件几个主要类的引用关系图。供参考。 由于时间的关系,不可能提供详细的使用说明,往谅解,有问题可邮件与作者联系或者QQ联系。 Mail:18909181984@189.cn QQ:57440981 TOpenCL --| | |--TclKernels --| |--- TclKernel --| | |-- TclK
### FFmpeg 中 `error splitting the argument list: Option not found` 的解决方法 在使用 FFmpeg 时,若遇到 `error splitting the argument list: Option not found` 错误,通常是因为 FFmpeg 命令中使用了不被当前版本支持的选项。解决此问题的核心方法是确保使用的是最新版本的 FFmpeg,并正确配置其运行环境。 #### 更新 FFmpeg 版本 某些旧版本的 FFmpeg 不支持较新的命令行参数,例如 `-vbsf` 或 `deadline` 等选项。更新到最新版本可以解决此类问题。可以通过从官方源下载最新版本的 FFmpeg 并进行安装[^1]。 ```bash # 下载最新版本的 FFmpeg wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 --no-check-certificate tar xjf ffmpeg-snapshot.tar.bz2 cd ffmpeg/ ``` #### 正确配置 FFmpeg 环境路径 如果系统中存在多个 FFmpeg 版本,确保默认调用的是最新版本。例如,在 Conda 环境中,若默认版本过旧,可通过修改脚本指定使用系统中最新安装的 FFmpeg 版本。在 `utils.py` 文件中,可以设置 `ffmpeg_path` 为最新版本的路径[^2]。 ```python ffmpeg_path = max(ffmpeg_paths, key=ffmpeg_suitability) ``` #### 验证 FFmpeg 安装 安装完成后,验证是否成功可以通过以下命令检查 FFmpeg 版本信息。 ```bash ffmpeg -version ``` #### 编译时启用必要的编码器 如果使用了特定编码器(如 `libx264`)而遇到问题,确保在编译 FFmpeg 时启用了相关编码器。配置命令应包含 `--enable-libx264` 和 `--enable-gpl` 等选项,并正确设置 `x264` 的头文件和库路径[^3]。 ```bash ./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/x264/include --extra-ldflags=-L/usr/local/x264/lib make make install ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值