PAT A1052(含边缘测试样例)

题目详情
这个题的基本思路还是数组模拟链表~整体思路确实不难,但是!边缘数据卡得有点,,,,

我能说什么,我也很无奈啊

没办法,看了一眼别人的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,会做的保证对,不会做的保证下次对

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值