codeup id=6116 Shortest Distance (20)

链表方式超时

#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;
}
 
 
 

猜你喜欢

转载自blog.csdn.net/qq_26004051/article/details/83620783