1046 Shortest Distance

ref:

http://tech-wonderland.net/blog/pat-1046-shortest-distance.html

提示整个路线是个圆,我的做法是针对每次输入,临时计算,结果有1个case 超时:

#include <stdio.h>

int n,m;
int d[100000+5];


int main(){
	freopen("in.txt","r",stdin);

	scanf("%d",&n);

	int cycLen = 0;
	for(int i = 1; i <= n; i++){
		scanf("%d", &d[i]);
		cycLen += d[i];
	}
	
	//这特码的是一个fucking圆, 从A到B的距离长度有两种:A->B, cycLen-(A->B)
	
	scanf("%d",&m);

	int d1, d2 = 0;
	int s,e;
	for(int i = 0; i < m; i++){
		scanf("%d%d",&s,&e);
		d1 = 0;
		if(s < e){
			for(int j = s; j < e; j++){
				d1 += d[j];
			}
		}else{
			for(int j = e; j < s; j++){
				d1 += d[j];
			}
		}
		d2 = cycLen - d1;
		printf("%d\n", d1 > d2 ? d2 : d1);
	}
	
	
	return 0;
}

然后还是采用了ref的方法

#include <stdio.h>
#include <math.h>

int n,m;
int dFromFirst[100000+5];


int main(){
	freopen("in.txt","r",stdin);

	scanf("%d",&n);

	int cycLen = 0;//圆的周长
	for(int i = 1; i <= n; i++){
		int tmp;
		scanf("%d", &tmp);
		
		
		dFromFirst[i] =cycLen;
		cycLen += tmp;

		//test
		//printf("i = %d dfrom= %d\n",i,dFromFirst[i]);
	}
	
	 
	
	scanf("%d",&m);

	int d1, d2 = 0;
	int s,e;
	for(int i = 0; i < m; i++){
		scanf("%d%d",&s,&e);
		d1 = dFromFirst[e] - dFromFirst[s];//输入的s可能大于e, 编译器不支持abs,fuck!
		d1 = d1 < 0 ? (0-d1) : d1;
		d2 = cycLen - d1;
		printf("%d\n", d1 > d2 ? d2 : d1);
	}
	
	
	return 0;
}



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