链表方式超时
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct node
{ struct node *next;
struct node *prior;
int data;
}Node,*Pnode;
int search_all(Pnode L,Pnode r)
{r=L;
while(r->next!=L)
{ //
r=r->next;
cout<<"-"<<r->data<<"-"<<endl;
// if(r==L)
// break;
}
return 0;
}
int initNode(Pnode N)
{if(N==NULL)
//cout<<"此表为空表"<<endl;
return 1;
else
//cout<<"此表不为空表"<<endl;
N==NULL;
return 0;
}
int findele(Pnode L,Pnode r,int N,Pnode &Q) //Q定位指针 r遍历指针
{ r=L;
for(int i=0;i<N;i++)
{
r=r->next;
}
Q=r;
//cout<<"Q的地址确定"<<Q<<"Q="<<Q->data<<endl;
return 0;
}
int pri_find(Pnode L,Pnode r,Pnode Q,int &court) //Q定位指针 r遍历指针 Q1 r Q2 court
{ r=Q;court=0;
while(1)
{
r=r->prior;
//cout<<"WEIZJI"<<r->data<<endl;
court+=r->data;
//cout<<"距离"<<court<<endl;
if(r==L)
{
break;
}
}
//cout<<"距离"<<court<<endl;
return 0;
}
int later_find(Pnode L,Pnode r,Pnode Q,int &court) //Q定位指针 r遍历指针
{ r=Q;court=0;
while(1)
{
court+=r->data;
//cout<<"WSDSADASDAD"<<r->data<<endl;
r=r->next;
if(r==L)
{break;
}
// cout<<r->data<<endl;
}
return 0;
}
int creat(Pnode L,Pnode &S,Pnode &P,int N)
{int a;
P=L;
//cout<<"输入数据"<<endl;
for(int i=0;i<N;i++)
{//cout<<"第"<<i+1<<"组"<<endl;
cin>>a;
S=(Pnode)malloc(sizeof(Node));
P->next=S;
S->data=a;
S->prior=P;
P=P->next;
}
return 0;
}
int main()
{int N,M1,M2,court1,court2,M;
Pnode L,S,P,r,Q1,Q2;
while(cin>>N)
{ if(N<3||N>100000)
initNode(L);
initNode(S);
// L=S=NULL;
L=(Pnode)malloc(sizeof(Node));
L->prior=NULL;
P=r=Q1=Q2=L;
creat(L,S,P,N);
P->next=L->next;
L->next->prior=P;
//search_all(L,r);//遍历链表
cin>>M;
for(int j=0;j<M;j++)
{
cin>>M1>>M2;
findele(L,r,M1,Q1);
findele(L,r,M2,Q2);
pri_find(Q1,r,Q2,court1); //Q定位指针 r遍历指针
later_find(Q1,r,Q2,court2); //Q定位指针 r遍历指针
//cout<<"前驱查找"<<court1<<endl;
// cout<<"后继查找"<<court2<<endl;
if(court1<court2)
cout<<court1<<endl;
else cout<<court2<<endl;
}
}return 0;
}
代码段 小部件
改为数组发现也是死活超时,观看他人写的代码,发现把循环输入去了就OK了。程序中不能嵌套循环,否则会出现超时现象。
#include<iostream>
using namespace std;
#define Maxsize 100000
int Distance_court_last(int a[],int M1,int M2)
{ int z=0;
for(int i=M1 ;i<M2 ;i++)
{z+=a[i];
// cout<<"distance1="<<a[i]<<endl;
}
return z;
}
int Distance_court_piror(int a[],int Num,int M1,int M2)
{ int z=0,i=M1;
while(i!=M2)
{
i--;
if(i<=0)
i=Num;
z+=a[i];
// cout<<"distance2="<<i<<" "<<a[i]<<endl;
// cout<<"z="<<z<<endl;
}
return z;
}
int main()
{int Num,a[Maxsize],time,right,left,sum1,sum2;
cin>>Num;
if(Num<=100000&&Num>=3)
{
for(int i=1;i<=Num;i++)
cin>>a[i];
cin>>time;
if(time<=10000)
for(int j=0;j<time;j++)
{ sum1=0;sum2=0;
int temp;
cin>>left>>right;
// if((left>10000)||(right>10000))
// break;
temp=left;
if(left>right)
{left=right;
right=temp;
}
sum1=Distance_court_last(a,left,right);
sum2=Distance_court_piror(a,Num,left,right);
if(sum1>sum2&&sum2<=10000000)
cout<<sum2<<endl;
else if(sum1<sum2&&sum1<=10000000)
cout<<sum1<<endl;
else break;
//cout<<sum1<<endl;
//cout<<sum2<<endl;
}
}
return 0;
}