pat 1046 Shortest Distance

题意是求一个环上的两点之间最短距离,纯粹模拟,最后一点超时,过不了。后来经人提示,不用保存各点的值,只要保存从起点到该点的值,即可。

代码:

//1046 18:30 -19:14
#include<stdio.h>
const int NUM=200008;
int a[NUM];

int main()
{
	int n,i,m,x,y,j;
	//freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);

	scanf("%d",&n);
	int ans=0,temp,suma=0;
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		a[i+n]=a[i];
		ans+=a[i];
	}
	scanf("%d",&m);
	while(m--){
		suma=0;
		scanf("%d%d",&x,&y);
		if(x>y){
			temp=y;
			y=x;
			x=temp;
		}
		if(y-x<=n-y+x){
			for(i=x;i<y;i++){
				suma+=a[i];
			}
		} else {
			for(i=y;i<n+x;i++){
				suma+=a[i];
			}
		}
		
		if(suma<=ans-suma)
			printf("%d\n",suma);
		else
			printf("%d\n",ans-suma);
	}
	return 0;
}


AC代码:

 

//1046 18:30 -19:14
#include<stdio.h>
const int NUM=200008;
int a[NUM];

int main()
{
	int n,i,m,x,y,j;
	//freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);

	scanf("%d",&n);
	int ans=0,temp,suma=0;
	a[0]=0;
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		ans+=a[i];
		a[i]+=a[i-1];
/*		a[i+n]=a[i];*/
		
	}
	scanf("%d",&m);
	while(m--){
		suma=0;
		scanf("%d%d",&x,&y);
		if(x>y){
			temp=y;
			y=x;
			x=temp;
		}
		suma=a[y-1]-a[x-1];
// 		if(y-x<=n-y+x){
// 			suma=a[y]
// 		} else {
// 			for(i=y;i<n+x;i++){
// 				suma+=a[i];
// 			}
// 		}
		
		if(suma<=ans-suma)
			printf("%d\n",suma);
		else
			printf("%d\n",ans-suma);
	}
	return 0;
}



 

你可能感兴趣的:(pat 1046 Shortest Distance)