题目详情
这个题的基本思路还是数组模拟链表~整体思路确实不难,但是!边缘数据卡得有点,,,,
没办法,看了一眼别人的attention,发现:可能有无效数据~~
明白了,我原来的程序是把无效数据一起算上了。
题目也没有说有无效数据啊(自己找台阶,先下去再说)
不过我们要这么想,如果都有效的话,,,那输出一遍个数是干嘛呀?
ok,那我们来看边缘处理叭~
首先你需要从头遍历一遍,找到有效数量&把有效的点标记出来
那排序的时候怎么把标记为无效的去掉呢?
直接放后面啊,把标记的那位也作为一个排序的规则:(是不是妙不可言~~)
不过这样其实你没有把那些无效的项真正去掉,所以在你输出的时候也要注意,如果它下一项无效你就得输出-1啦
老规矩说说自己的蠢事:
-
一开始在截图1的那个特判的时候写的p[addd[j]].end!=0;注意,如果这个点不存在,即addd[j]=0,那你对应过来p[addd[j]]就是p[0]的值了…
后面解决这个问题就是为addd全部赋值!(复杂度没有很高,这在这个地方很常见)
-
特判的时候一定不要忘记else,呜呜否则你会输出两遍!
-
这个地方没有卡住我嘿嘿
这里-1的时候就不要限制五位啦!!!
提供几组训练自己的程序的测试样例!
#Case1:
5 00001
10203 100 23849
00001 0 22222
33333 100000 -1
12345 -1 33333
22222 1000 12345
output:
4 12345
12345 -1 00001
00001 0 22222
22222 1000 33333
33333 100000 -1
//这个就是普普通通的只有一个无效数据的
#Case2:
5 00001
00001 0 -1
02328 9 83448
92749 83 83029
28398 093 83190
88289 89 74399
output:
1 00001
00001 0 -1
//这个就是普普通通的只有一个有效数据的
#Case3:
5 00001
00301 0 -1
02328 9 83448
92749 83 83029
28398 093 83190
88289 89 74399
output:
0 -1
//这个就是普普通通的,,,根本没有有效数据的
自己的代码如下 (起码样例跑过了呜呜)
#include<iostream>
#include<vector>
#include <queue>
#include <algorithm>
#include<cstdio>
#include <map>
#include <stack>
#include <math.h>
using namespace std;
struct Point{
int start;
int c;
int end=0;
int order=0;
}p[100010];//p的下标就是起始了
int addd[100010];
bool cmp(Point p1,Point p2){
if(p1.order==0 || p2.order == 0){
return p1.order>p2.order;
}
else
return p1.c<p2.c;
}
int n,begin_all;
int main(){
for (int i = 0; i < 10010; ++i) {
addd[i]=100010;
}
cin>>n>>begin_all;
for (int i = 0; i < n; ++i) {
int b,c,e;
cin>>b>>c>>e;
p[i].start=b;
p[i].c=c;
p[i].end=e;
addd[b]=i;
}
int count=0;
int j=begin_all;
// cout<<p[addd[j]].end<<endl;
while(j!=-1){
if(addd[j]!=100010) {//一开始写的p[addd[j]].end!=0;注意,如果这个点不存在,即addd[j]=0,那你对应过来p[addd[j]]就是p[0]的值了
p[addd[j]].order = 1;
//cout<<j<<" "<<p[addd[j]].end<<endl;
j = p[addd[j]].end;
count++;
}
else{
break;
}
}
if(count==0){
cout<<0<<" "<<-1<<endl;
}
else {//注意这里两种情况要写else
sort(p, p + n, cmp);
for (int i = 0; i < n; ++i) {
if (p[i].order == 1) {
if (i != n - 1 && p[i + 1].order != 0) {//后面这个条件很重要,否则的话就会把无效的点也放进去
p[i].end = p[i + 1].start;
} else {
p[i].end = -1;
}
}
}
printf("%d %05d\n", count, p[0].start);
for (int i = 0; i < n; ++i) {
if (p[i].order == 1) {
if (i != n - 1 && p[i + 1].order != 0)
printf("%05d %d %05d\n", p[i].start, p[i].c, p[i].end);
else {
printf("%05d %d %d\n", p[i].start, p[i].c, p[i].end);
}
}
}
}
return 0;
};
最近写代码每次都改bug好久,,有时候全是无脑问题呜呜,还是要 ,,1,多动手写不要光看 2,会做的保证对,不会做的保证下次对