bool compare(int a,int b)
return a<b; //升序排列,如果改为return a>b,则为降序
下面是思路实现出来的代码(感觉用了不少循环,提交后发现确实用时有点多,51ms,可以注意代码优化了)
#include<algorithm>
using namespace std;
const int maxn = 100010;
struct NODE {
int addr;//节点存放自己地址
int data;
int next;
}list[maxn];
bool cmp(NODE a, NODE b) {
return a.data < b.data;
}
int main() {
int n, start;
scanf("%d %d", &n, &start);
if (n == 0) return 0;
int addr, data, next;
for (int i = 0; i < n; i++) {
scanf("%d %d %d", &addr, &data, &next);
list[i].addr = addr;
list[i].data = data;
list[i].next = next;
}
if (n == 1) {
printf("%d %05d\n", n, list[0].addr);
if (list[0].next == -1)
printf("%05d %d %d\n", list[0].addr, list[0].data, list[0].next);
else
printf("%05d %d %05d\n", list[0].addr, list[0].data, list[0].next);
return 0;
}
sort(list, list + n, cmp);
for (int j = 0; j < n; j++) {
if (j == n - 1)list[j].next = -1;
else list[j].next = list[j + 1].addr;
}
printf("%d %05d\n", n, list[0].addr);
for (int k = 0; k < n; k++) {
if (list[k].next == -1)
printf("%05d %d %d\n", list[k].addr, list[k].data, -1);
else
printf("%05d %d %05d\n", list[k].addr, list[k].data, list[k].next);
}
return 0;
}
提交结果是21分,部分正确,因此去看算法笔记里面的题解和网上的题解,看4分错在哪里。
3. 改进
最终AC代码
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100005;
struct NODE {
int addr;
int data;
int next;
bool in;
}list[maxn];
bool cmp(NODE a, NODE b) {
//把不在链表上的都放到后面去,这样没有用到的位置也会被排到后面去,因此数组前面的元素都是链表上的节点
if (a.in == false || b.in == false)
return a.in > b.in;
else return a.data < b.data;//data大的排到后面去
}
int main() {
for (int i = 0; i < maxn; i++) {
list[i].in = false;
}
int n, start;
scanf("%d%d", &n, &start);
int addr, data, next;
for (int j = 0; j < n; j++) {
scanf("%d%d%d", &addr, &data, &next);
list[addr].addr = addr;
list[addr].data = data;
list[addr].next = next;
}
int tmp = start;//临时链表“指针”
int count = 0;//在链表上的节点数
while (tmp != -1) {
list[tmp].in = true;
count++;
tmp = list[tmp].next;
}
if (count == 0) printf("0 -1");//新链表没有节点就输出0 -1
else {
sort(list, list + maxn, cmp);//将链表上的节点按data从小到大排在数组前面的位置
/* 可以省去这一步,在print的时候写就好
for (int j = 0; j < n; j++) {
if (j == n - 1)list[j].next = -1;
else list[j].next = list[j + 1].addr;
}
*/
printf("%d %05d\n", count, list[0].addr);
for (int k = 0; k < count; k++) {
//if (list[k].next == -1) 因为没有前面的循环,要改个判断条件
if (k == count - 1)
printf("%05d %d %d\n", list[k].addr, list[k].data, -1);
else
printf("%05d %d %05d\n", list[k].addr, list[k].data, list[k + 1].addr);
}
}
return 0;
}
发现其实时间是61ms,而且初始化和排序都是整个数组,所以这道题时间本身就会长一点吧。
原文:https://www.cnblogs.com/3-louise-wang/p/14371882.html