题目
1032、1052、1074、1097、1133、
总结
过程
1.根据需求定义静态链表
2.节点输入,排序实现链表填充
3.输出
注意点
1.struct内部定义变量num用vector或sort进行排序
2.节点分类,定义cnt1,cnt2…
3.struct内部定义变量flag用来区分是否遍历,结尾输出-1
4.要注意不用的节点排除,是否为空,尽量用STL如reverse
时间
完成2021年7月31日11:42:22
复习
代码
//1032
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
struct Node{
char data;
int next;
bool flag;
}node[maxn];
int main(){
for(int i=0;i<maxn;i++){
node[i].flag=false;
}
int s1,s2,n;
cin>>s1>>s2>>n;
int address,next;
char data;
for(int i=0;i<n;i++){
cin>>address>>data>>next;
node[address].data=data;
node[address].next=next;
}
int p;
for(p=s1;p!=-1;p=node[p].next){
node[p].flag=true;
}
for(p=s2;p!=-1;p=node[p].next){
if(node[p].flag==true){
break;
}
}
if(p!=-1){
printf("%05d",p);
}
else cout<<-1;
return 0;
}
//pat1052
#include<bits/stdc++.h>
using namespace std;
struct Node{
int address, key, next;
bool flag;
}node[100000];
vector <Node> v;
int cmp (Node a, Node b){
return a.key<b.key;
}
int main(){
int n,cnt=0,s,a,b,c;
cin>>n>>s;
for(int i=0;i<n;i++){
cin>>a>>b>>c;
node[a]={a,b,c,0};
}
for(int i=s;i!=-1;i=node[i].next){
v.push_back(node[i]);
cnt++;
}
if(cnt==0){
cout<<0<<" "<<-1;
}else{
sort(v.begin(),v.end(),cmp);
printf("%d %05d\n",cnt, v[0].address);
for(int i=0;i<cnt;i++){
printf("%05d %d ",v[i].address,v[i].key);
if(i!=cnt-1){
printf("%05d\n",v[i+1].address);
}
else cout<<-1<<endl;
}
}
return 0;
}
//1074
//1074
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
struct Node{
int ad;
int val;
int next;
}node[maxn];
vector <Node> a;
int main(){
int fad,k,n;
int ad,val,next;
cin>>fad>>n>>k;
for(int i=0;i<n;i++){
cin>>ad>>val>>next;
node[ad].ad=ad;
node[ad].val=val;
node[ad].next=next;
}
for(int i=fad;i!=-1;i=node[i].next){
a.push_back(node[i]);
}
int size=a.size();
for(int i=0;i<size-size%k;i+=k){
reverse(a.begin()+i,a.begin()+k+i);
}
//翻转
for(int i=0;i<size-1;i++){
printf("%05d %d %05d\n",a[i].ad,a[i].val,a[i+1].ad);
}
printf("%05d %d %d",a[size-1].ad,a[size-1].val,-1);
return 0;
}
//1097
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000;
struct Node{
int address,key,next,num=2*maxn;
}node[maxn];
int camp(Node a,Node b){
return a.num<b.num;
}
bool exist[maxn];
int main(){
int begin,n,cnt1=0,cnt2=0,a;
cin>>begin>>n;
for(int i=0;i<n;i++){
cin>>a;
cin>>node[a].key>>node[a].next;
node[a].address=a;
}
for(int i=begin;i!=-1;i=node[i].next){
if(exist[abs(node[i].key)]==0){
exist[abs(node[i].key)]=1;
node[i].num=cnt1;
cnt1++;
}
else{
node[i].num=maxn+cnt2;
cnt2++;
}
}
sort(node,node+maxn,camp);
int cnt=cnt1+cnt2;
for(int i=0;i<cnt;i++){
if(i!=cnt-1&&i!=cnt1-1){
printf("%05d %d %05d\n",node[i].address,node[i].key,node[i+1].address);
}else{
printf("%05d %d -1\n",node[i].address,node[i].key);
}
}
return 0;
}
//1133
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
struct Node{
int address,key,next,num=3*maxn;
}node[maxn];
int camp(Node a,Node b){
return a.num<b.num;
}
int main(){
int cnt1=0,cnt2=0,cnt3=0;
int begin,n,k;
cin>>begin>>n>>k;
int a;
for(int i=0;i<n;i++){
cin>>a;
cin>>node[a].key>>node[a].next;
node[a].address=a;
}
for(int i=begin;i!=-1;i=node[i].next){
if(node[i].key<0){
node[i].num=cnt1;
cnt1++;
}
else if(node[i].key>k){
node[i].num=2*maxn+cnt3;
cnt3++;
}
else {
node[i].num=cnt2+maxn;
cnt2++;
}
}
int cnt=cnt1+cnt2+cnt3;
sort(node,node+maxn,camp);
for(int i=0;i<cnt;i++){
if(i!=cnt-1){
printf("%05d %d %05d\n",node[i].address,node[i].key,node[i+1].address);
}else{
printf("%05d %d -1",node[i].address,node[i].key);
}
}
return 0;
}