https://pintia.cn/problem-sets/994805260223102976/problems/994805296180871168
一开始用了本办法,后面看了聪明的写法,自己重新写了一遍,得了25分。
测试点6是有游离结点的情况时,逆序需要根据实际结点数来循环。
#include<iostream>
#include<string.h>
#include <algorithm>
using namespace std;
int main(){
int addr, arr[100000], data[100000], next[100000];
for(int i=0; i<100000; i++)
next[i] = -2;
int head, n, k, j=0;
cin >> head >> n >> k;
// 输入
for(int i=0; i<n; i++){
cin >> addr;
cin >> data[addr] >> next[addr];
}
// 排序
do{
arr[j++] = head;
head = next[head];
}while(head>-1 &&next[head]>-2);
// 反转
for(int i=0; k>1 && i<j/k; i++)// 测试点6 注意是j/k,不是n/k
reverse(arr+i*k, arr+(i+1)*k);
// 输出
for(int i=0; i<j; i++)
if(i<j-1)
printf("%05d %d %05d\n", arr[i], data[arr[i]], arr[i+1]);
else
printf("%05d %d -1\n", arr[j-1], data[arr[j-1]]);
}
这是一开始的笨办法,只得了23分。
int main(){
int a, b, c, head, d=0;
int addr, value, next;
int l, r, p, q;
cin >> a >> b >> c;
int node[b][3], temp[4], num[100000];
// 输入
for(int i=0; i<b; i++){
cin >> addr >> value >> next;
num[addr]=i;
if(addr==a) head=i;
node[i][0] = addr;
node[i][1] = value;
node[i][2] = next;
}
// 调整顺序
for(int i=0; i<b; i++){
if(num[node[head][2]]==NULL){
b=i+1;
break;
}
if(head != i){
temp[0] = node[head][0];
temp[1] = node[head][1];
temp[2] = node[head][2];
temp[3] = num[node[head][0]];
num[node[head][0]] = num[node[i][0]];
node[head][0] = node[i][0];
node[head][1] = node[i][1];
node[head][2] = node[i][2];
num[node[i][0]] = temp[3];
node[i][0] = temp[0];
node[i][1] = temp[1];
node[i][2] = temp[2];
}
head = num[node[i][2]];
}
// 反转
for(int i=0; i<b; i++){
if((i+1)%c==1)
l=i;
if((i+1)%c==0){
r=i;
p=l;
q=r;
while(l<r){
temp[0] = node[l][0];
temp[1] = node[l][1];
temp[2] = node[l][2];
node[l][0] = node[r][0];
node[l][1] = node[r][1];
node[l][2] = node[r-1][0];
node[r][0] = temp[0];
node[r][1] = temp[1];
node[r-1][2] = node[r][0];
l++;
r--;
}
if((q+1)/c>1)
node[p-1][2] = node[p][0];
}
}
// 输出
for(int i=0; i<b-1; i++)
printf("%05d %d %05d\n", node[i][0], node[i][1], node[i][2]);
printf("%05d %d -1\n", node[b-1][0], node[b-1][1]);
return 0;
}