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

 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数组,数组下标表示地址,以此来减少排序时间。具体实现代码如下

 #include <iostream>
#include <string.h>
#include <iomanip>
using namespace std; int main()
{
int count ,add,renum;
cin>>add>>count>>renum;
int add1[],num[],add2[];
for(int i=;i<=;i++)
{
add1[i]=;
add2[i]=;
num[i]=;
}
for(int i=;i<count;i++)
{
int a,b,c;
cin>>a>>b>>c;
add1[a]=a;
num[a]=b;
add2[a]=c; }
add2[]=add;
int before=;
int late=-;
int re[renum];
int total=;
int sha=;
while(add2[sha]!=-)
{
sha=add2[sha];
total++;
}
int xunh = total/renum;
for(int j=;j<xunh;j++)
{
int x = add2[before];
for(int i=;i<renum;i++)
{
re[renum--i] = x;
x=add2[x];
if(i==renum-)
{
late = x;
}
}
add2[before] = re[];
for(int i=;i<renum-;i++)
{
add2[re[i]] = re[i+];
}
add2[re[renum-]] = late;
before = re[renum-];
}
int m =;
while(m!=-)
{
m=add2[m];
if(m!=- &&add2[m]!=-)
cout<<setw()<<setfill('')<<add1[m]<<" "<<num[m]<<" "<<setw()<<setfill('')<<add2[m]<<endl;
else if(m!=-)
cout<<setw()<<setfill('')<<add1[m]<<" "<<num[m]<<" "<<add2[m]<<endl;
}
return ;
}

上传检验成功。

以上。

05-15 17:21