PAT-1133(Splitting A Linked List)vector的应用+链表+思维
Splitting A Linked List
PAT-1133
- 本题一开始我是完全按照构建链表的数据结构来模拟的,后来发现可以完全使用两个vector来解决
- 一个重要的性质就是位置是相对不变的。
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<sstream>
#include<set>
#include<map>
using namespace std;
const int maxn=100005;
struct Node{
int address,data,next;
int trnext;//下一节点
// int trpre;//父节点
Node(){}
Node(int a,int b,int c):address(a),data(b),next(c){}
};
Node node[maxn];
map<int,int>ma;
int main(){
int start,n,k;
cin>>start>>n>>k;
for(int i=0;i<n;i++){
int address,data,next;
cin>>address>>data>>next;
ma[address]=i;
node[i]=Node(address,data,next);
if(address==start){
start=i;
}
}
for(int i=0;i<n;i++){
int next=node[i].next;
int trnext;
if(next==-1)
trnext=-1;
else trnext=ma[next];
node[i].trnext=trnext;
}
int neg=-1;//指向当前待插入的负数节点
int now=start;//当前节点
int pre=-1;//前驱结点
for(int next=start;next!=-1;){
int data=node[next].data;
now=next;
next=node[next].trnext;
if(data<0){
if(neg==-1&&pre==-1){//第一个出现的负节点 和头结点
pre=now;
neg=now;
}else if(neg==-1){
node[pre].trnext=next;
node[now].trnext=start;
start=now;
neg=start;//第一个 非head的负节点
//pre不变
}else{
node[pre].trnext=next;
node[now].trnext=node[neg].trnext;
node[neg].trnext=now;
neg=now;
}
}else{
pre=now;
}
}
//所有在0-k之间的数必须出现在大于k的数之前
pre=neg;
int next;
if(neg==-1){
next=start;
}else next=node[neg].trnext;
for(;next!=-1;){
int data=node[next].data;
now=next;
next=node[next].trnext;
if(data<=k&&data>=0){
if(neg==-1&&pre==-1){//第一个出现的负节点 和头结点
pre=now;
neg=now;
}else if(neg==-1){//表示没有负数节点
node[pre].trnext=next;
node[now].trnext=start;
start=now;
neg=now;//第一个 非head的负节点
//pre不变
}else{
node[pre].trnext=next;
node[now].trnext=node[neg].trnext;
node[neg].trnext=now;
neg=now;
}
}else{
pre=now;
}
}
for(now=start;now!=-1;now=node[now].trnext){
int a=node[now].address;
int b=node[now].data;
int c=node[now].trnext;
if(c!=-1){
c=node[c].address;
}
if(c!=-1){
printf("%05d %d %05d\n",a,b,c);
}else{
printf("%05d %d %d\n",a,b,c);
}
// cout<<node[now].address<<" "<<node[now].data<<" "<<node[node[now].trnext].address<<endl;
}
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
struct node{
int id,data,next;
};
int main(){
int begin, n, k, s, d, e;
cin>>begin>>n>>k;
node a[100010];
vector<node> v,ans;
for(int i=0;i<n;i++){
scanf("%d%d%d\n",&s,&d,&e);
a[s]={s,d,e};
}
for(;begin!=-1;begin=a[begin].next){
v.push_back(a[begin]);
}
for(int i=0;i<v.size();i++){
if(v[i].data<0)ans.push_back(v[i]);
}
for(int i=0;i<v.size();i++){
if(v[i].data>=0 && v[i].data<=k)ans.push_back(v[i]);
}
for(int i=0;i<v.size();i++){
if(v[i].data>k)ans.push_back(v[i]);
}
for(int i=0;i<ans.size();i++){
if(i!=ans.size()-1)printf("%05d %d %05d\n",ans[i].id,ans[i].data,ans[i+1].id);
else printf("%05d %d -1",ans[i].id,ans[i].data);
}
return 0;
}
PAT-1133(Splitting A Linked List)vector的应用+链表+思维的更多相关文章
- PAT 1133 Splitting A Linked List[链表][简单]
1133 Splitting A Linked List(25 分) Given a singly linked list, you are supposed to rearrange its ele ...
- PAT 1133 Splitting A Linked List
Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...
- PAT A1133 Splitting A Linked List (25 分)——链表
Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...
- 1133 Splitting A Linked List
题意:把链表按规则调整,使小于0的先输出,然后输出键值在[0,k]的,最后输出键值大于k的. 思路:利用vector<Node> v,v1,v2,v3.遍历链表,把小于0的push到v1中 ...
- PAT A1133 Splitting A Linked List (25) [链表]
题目 Given a singly linked list, you are supposed to rearrange its elements so that all the negative v ...
- PAT1133:Splitting A Linked List
1133. Splitting A Linked List (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- PAT_A1133#Splitting A Linked List
Source: PAT A1133 Splitting A Linked List (25 分) Description: Given a singly linked list, you are su ...
- PAT乙级真题及训练题 1025. 反转链表 (25)
PAT乙级真题及训练题 1025. 反转链表 (25) 感觉几个世纪没打代码了,真是坏习惯,调了两小时把反转链表调出来了,心情舒畅. 这道题的步骤 数据输入,数组纪录下一结点及储存值 创建链表并储存上 ...
- PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)
PAT (Basic Level) Practise (中文)-1025. 反转链表 (25) http://www.patest.cn/contests/pat-b-practise/1025 ...
随机推荐
- java大数函数(附官方文档链接)
java文档 字段摘要 static BigInteger ONE BigInteger 的常量 1. static BigInteger TEN BigInt ...
- Codeforces Round #648 (Div. 2) F. Swaps Again
题目链接:F.Swaps Again 题意: 有两个长度为n的数组a和数组b,可以选择k(1<=k<=n/2)交换某一个数组的前缀k和后缀k,可以交换任意次数,看最后是否能使两个数组相等 ...
- Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) A. Kids Seating (规律)
题意:给你一个正整数\(n\),在\([1,4n]\)中找出\(n\)个数,使得这\(n\)个数中的任意两个数不互质且不能两两整除. 题解:这题我是找的规律,从\(4n\)开始,往前取\(n\)个偶数 ...
- Codeforces Round #304 (Div. 2) C. Basketball Exercise (DP)
题意:给你两个长度相同的数组,每次从两个数组中选数(也可以不选),但是不可以在同一个数组中连续选两次,问能选的最大值是多少? 题解:dp,\(dp[i][0]\)表示第\(i\)个位置不选,\(dp[ ...
- Linux命令之find命令中的-mtime参数
有关find -mtime的参数解释 mtime参数的理解应该如下: -mtime n 按照文件的更改时间来找文件,n为整数. n表示文件更改时间距离为n天, -n表示文件更改时间距离在n天以内,+n ...
- 排序算法 以及HKU的一些数据结构 相关题目 以及 K叉树,二叉树 排列
冒泡排序.选择排序.快速排序.插入排序.希尔排序.归并排序.基数排序以及堆排序,桶排序 https://www.cnblogs.com/Glory-D/p/7884525.html https://b ...
- codeforces 1030D Vasya and Triangle【思维+gcd】
题目:戳这里 题意:选出三个点构成三角形,要求面积为n*m/k. 解题思路:因为三个点的坐标都是正整数,根据三角形面积公式(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))/2=n* ...
- Leetcode(7)-反转整数
给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...
- js console 性能测试 & don't-use-array-foreach-use-for-instead
don't-use-array-foreach-use-for-instead slower https://coderwall.com/p/kvzbpa/don-t-use-array-foreac ...
- CSP & CORS
CSP & CORS 内容安全策略 跨域资源共享 CSP https://developers.google.com/web/fundamentals/security/csp google ...