zoukankan      html  css  js  c++  java
  • PAT 链表倒序的算法优化

    之前的答案错误问题已经解决了,现在还有运行超时的问题,先贴上之前的代码

     1 #include <iostream>
     2 #include <string.h>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int count, renum;
     8     string add;
     9     cin>>add>>count>>renum;
    10     string add1[count],add2[count],madd1[count],madd2[count];
    11     int mnum[count],num[count];
    12     for(int i=0;i<count;i++)
    13     {
    14         cin>>add1[i]>>num[i]>>add2[i];
    15     }
    16     for(int i=0;i<count;i++)
    17     {
    18 
    19         for(int j=0;j<count;j++)
    20        {
    21            if(add1[j]==add)
    22            {
    23                madd1[i] = add1[j];
    24                mnum[i]=num[j];
    25                madd2[i] = add2[j];
    26                add=madd2[i];
    27                break;
    28            }
    29        }
    30     }
    31     int temp=0;
    32     int fake = count;
    33     while(count-renum>=0)
    34     {
    35         for(int i= temp,j=temp+renum-1;i<=temp+renum-1;i++,j--)
    36         {
    37             add1[i] = madd1[j];
    38             num[i] = mnum[j];
    39         }
    40         count-=renum;
    41         temp=temp+renum;
    42     }
    43     for(int i=temp;i<fake;i++)
    44     {
    45 
    46             add1[i] = madd1[i];
    47             num[i] = mnum[i];
    48     }
    49     for(int i=0;i<fake-1;i++)
    50     {
    51         add2[i]=add1[i+1];
    52     }
    53     add2[fake-1] = "-1";
    54     for(int i=0;i<fake;i++)
    55     {
    56         cout<<add1[i]<<" "<<num[i]<<" "<<add2[i]<<endl;
    57     }
    58     return 0;
    59 }
    

      这个程序的复杂度为o(n*n),现在想办法降低复杂度,分析可以发现大部分时间是花在将输入数据按顺序排序上,然后我想到如果输入数据的每一行的第一个,和第三个数据真的表示为地址的话,就省去了排序的时间,所以,我们可以开一个10w数组,数组下标表示地址,以此来减少排序时间。具体实现代码如下

     1 #include <iostream>
     2 #include <string.h>
     3 #include <iomanip>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int count ,add,renum;
     9     cin>>add>>count>>renum;
    10     int add1[100001],num[100001],add2[100001];
    11     for(int i=0;i<=100000;i++)
    12     {
    13         add1[i]=0;
    14         add2[i]=0;
    15         num[i]=0;
    16     }
    17     for(int i=0;i<count;i++)
    18     {
    19         int a,b,c;
    20         cin>>a>>b>>c;
    21         add1[a]=a;
    22         num[a]=b;
    23         add2[a]=c;
    24 
    25     }
    26     add2[100000]=add;
    27     int before=100000;
    28     int late=-1;
    29     int re[renum];
    30     int total=0;
    31     int sha=100000;
    32     while(add2[sha]!=-1)
    33     {
    34         sha=add2[sha];
    35         total++;
    36     }
    37     int xunh = total/renum;
    38     for(int j=0;j<xunh;j++)
    39     {
    40          int x = add2[before];
    41         for(int i=0;i<renum;i++)
    42         {
    43             re[renum-1-i] = x;
    44             x=add2[x];
    45             if(i==renum-1)
    46             {
    47                 late = x;
    48             }
    49         }
    50         add2[before] = re[0];
    51         for(int i=0;i<renum-1;i++)
    52         {
    53             add2[re[i]] = re[i+1];
    54         }
    55         add2[re[renum-1]] = late;
    56         before = re[renum-1];
    57     }
    58     int m =100000;
    59     while(m!=-1)
    60     {
    61         m=add2[m];
    62         if(m!=-1 &&add2[m]!=-1)
    63             cout<<setw(5)<<setfill('0')<<add1[m]<<" "<<num[m]<<" "<<setw(5)<<setfill('0')<<add2[m]<<endl;
    64         else if(m!=-1)
    65             cout<<setw(5)<<setfill('0')<<add1[m]<<" "<<num[m]<<" "<<add2[m]<<endl;
    66     }
    67     return 0;
    68 }

    上传检验成功。

    以上。

  • 相关阅读:
    mysql数据创建带参的存储过程,并在存储过程中调用另一个存储过程
    python解析.xls/.xlsx文件--openpyxl模块(第三方)
    python使用django开发接口
    Mysql创建存储过程--批量插入数据
    Centos7下安装kafka,并使用python操作kafka的简单使用
    Centos7下安装JDK1.8
    Centos7下docker的安装
    python解析.xml文件-- xmltodict模块(第三方)
    解决:git SSL certificate problem: unable to get local issuer certificate
    AD域是什么意思?
  • 原文地址:https://www.cnblogs.com/shuhaoz/p/4433440.html
Copyright © 2011-2022 走看看