PAT-1032

这道题最先开始时用栈和map来做的,首先将两个链表压入栈中,然后从栈顶开始比较两个元素,发现最后一个数据超时了。

然后用一种比较巧的方法,计算每个节点的反向链接节点数目,只要是交点,反向链接节点数目就会是2,由此计算出交集点。发现最后一个测试用例还是超时,于是网上搜罗了一下,发现网上有人用第一种方法就过了,奇怪,难道是我把整数都处理成字符串的原因?输入输出换成了cin>>,cout原因?这些细节都要注意。第一种方法写出来代码

// 1032.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<string>
#include<iostream>
#include<map>
#include<stack>
using namespace std;

struct Node
{
    char data;
    string next;
};
stack<string> s1;
stack<string> s2;

int main()
{
    string start,end;
    string a;
    int n;
    map<string,Node> list;
    freopen("1032-in.txt","r",stdin);
    //freopen("1032-out.txt","w",stdout);
    while(cin>>start>>end>>n)
    {
        for(int i=0;i<n;i++)
        {
            Node node;
            cin>>a>>node.data>>node.next;
            list.insert(make_pair(a,node));//map-insert
        }
    }
    string next=start;
    while(true)
    {
        s1.push(next);
        map<string,Node>::iterator it=list.find(next); //map-find
        if(it!=list.end())
            next=it->second.next;
        else
            break;
        if(next=="-1")
            break;
    }
    next=end;
    while(true)
    {
        s2.push(next);
        map<string,Node>::iterator it=list.find(next);//map-find
        if(it!=list.end())
          next=it->second.next;
        else
            break;
        if(next=="-1")
            break;
    }
    string t1,t2;
    string pos="";
    while(true)
    {
        t1=s1.top();
        t2=s2.top();
        s1.pop();
        s2.pop();
        if(t1!=t2||s1.empty()||s2.empty())
            break;
        pos=t1;
    }
    if(!pos.empty())
        cout<<pos<<endl;
    else
        cout<<"-1"<<endl;

    return 0;
}

map.find返回迭代器,map.erase输入迭代器的位置,或者输入关键字的值。map要熟练使用

最后用的是网上比较多人使用做标记的方法,第一次访问过的元素全部坐上标记。

从start2开始访问,只要是交集节点,再次访问时候,标志位就为1,如此交集节点算出来了。这题目是2012年研究生入学考试题目,为嘛我一点印象都没有了。。。。。。

// 1032.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdio.h>
#include<string>
#include<iostream>
#include<map>
#include<stack>
using namespace std;
struct Node
{
    char data;
    int next;
}node[100010];

bool flag[100010];

int main()
{
    int a,b,n;
    int s1,s2;
    char data;
    freopen("1032-in.txt","r",stdin);
    while(scanf("%d%d%d",&a,&b,&n)!=EOF)
    {
        int pos=-1;
        for(int i=0;i<n;i++)
        {
            scanf("%d %c %d",&s1,&data,&s2);
            node[s1].next=s2;
        }
        int next=a;
        while(next!=-1)
        {
            flag[next]=true;
            next=node[next].next;
        }
        next=b;
        while(next!=-1)
        {
            if(flag[next])
            {
                pos=next;
                break;
            }
            next=node[next].next;
        }
        if(a==b)
        {
            printf("%05d\n",a);
            return 0;
        }
        if(pos!=-1)
          printf("%05d\n",pos);
        else
          printf("-1\n");
    }
    return 0;
}

注意有一个测试用例是,两个起始节点是一样的。

时间: 2024-10-03 20:44:08

PAT-1032的相关文章

PAT 1032 (未完成)

斗智斗勇系列,这个时间限制太变态了,10^5的数据读进去100ms就完蛋,buffer又不能太多开,但是8M buffer开出来其实也没啥用,还是超时 除去超时数据点,还有一个数据点没有过,不知道是什么边界条件,不管了 判断两条链表是否相交,首先两条链表都走到最后一个节点,如果节点相同,则说明这两条链表是相交的.算出两条链表的长度,len1,len2,max(len1, len2) - min(len1, len2),长的链表先走diff step,再和短的链表一起走,相遇的节点即为共同节点的起

PAT 1032. Sharing (25)

1032. Sharing (25) To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, "loading" and "being

PAT 1032. 挖掘机技术哪家强

PAT1032. 挖掘机技术哪家强 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号).及其比赛成绩(百分制),中间以空格分隔. 输出格式: 在一行中给出总得分最高的学校的编号.及其总分,中间以空格分隔.题目保证答案唯一,没有并列. 输入样例: 6 3 65 2 80 1 100 2

PAT 1032. Sharing

其实就是链表求交: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <unordered_map> 5 6 using namespace std; 7 8 class Node { 9 public: 10 Node() : data(0), next(0) {} 11 char data; 12 int next; 13 }; 14 15 void pri

PAT乙级 1032. 挖掘机技术哪家强(20)

1032. 挖掘机技术哪家强(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号).及其比赛成绩(百分制),中间以空格分隔. 输出格式: 在一行中

PAT Basic 1032

1032 挖掘机技术哪家强 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过10^5^的正整数N,即参赛人数.随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号).及其比赛成绩(百分制),中间以空格分隔. 输出格式: 在一行中给出总得分最高的学校的编号.及其总分,中间以空格分隔.题目保证答案唯一,没有并列. 输入样例: 6 3 65 2 80 1 100 2 70

PAT乙级1032

题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805289432236032 题解 用数组的下标表示学校,数组元素表示分数.统计各校分数后,遍历求最大就好了. 做这道题遇到一个memset初始化数组元素的问题,具体见https://www.cnblogs.com/chouxianyu/p/11322984.html // PAT BasicLevel 1032 // https://pintia.cn/pro

1032. Sharing (25)【链表】——PAT (Advanced Level) Practise

题目信息 1032. Sharing (25) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix.

PAT (Basic Level) Practice 1032 挖掘机技术哪家强

个人练习 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 10?^5的正整数 N,即参赛人数.随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号).及其比赛成绩(百分制),中间以空格分隔. 输出格式: 在一行中给出总得分最高的学校的编号.及其总分,中间以空格分隔.题目保证答案唯一,没有并列. 输入样例: 6 3 65 2 80 1 100 2 70

PAT算法题C++实现(Basic)1032 挖掘机技术哪家强

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式:输入在第 1 行给出不超过 10?5?? 的正整数 N,即参赛人数.随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号).及其比赛成绩(百分制),中间以空格分隔. 输出格式:在一行中给出总得分最高的学校的编号.及其总分,中间以空格分隔.题目保证答案唯一,没有并列. 输入样例:63 652 801 1002 703 403 0输出样