PAT A 1046 Shortest Distance

題源:https://pintia.cn/problem-sets/994805342720868352/problems/994805435700199424

Ans1:

#include <iostream>
#include <vector>
using namespace std;
// 運行超時,,,需優化。
int main(){
	int n,m;
	cin>>n;
	vector<int> d(n,0);
	for(int i=0;i<n;i++){
		cin>>d[i];
	}
	int a,b;
	cin>>m;
	while(m>=0&&m--){
		cin>>a>>b;
		if(a>b) swap(a,b);
		int s1=0,s2=0;
		for(int i=a-1;i<b-1;i++) s1+=d[i];
		for(int i=b-1;i<n;i++) s2+=d[i];
		for(int i=0;i<a-1;i++) s2+=d[i];
		cout<<min(s1,s2)<<endl;
	}
	return 0;
}

Ans2,優化思路如下:

問題可描述爲:整個路徑爲無向環,一點到一點的順短還是逆短

1.設計數組D[i]存儲1到i+1的距離,那麼i與j的順長度爲D[j]-D[i].

2.逆長度設計,總環長度減去順長度則爲逆長度。

3.總環長存儲,d[n]

#include <iostream>
#include <vector>
using namespace std;
int main(){
	int n,m;
	cin>>n;
	vector<int> d(n+1,0);//d[0]表示1到1的距離爲0
	for(int i=1;i<=n;i++){//d[i]爲1到i+1的距離,d[n]存儲整個環的距離
		cin>>d[i];
		d[i]+=d[i-1];
	}
	int a,b;
	cin>>m;
	while(m--){
		cin>>a>>b;
		if(a>b) swap(a,b);
		int ans=d[b-1]-d[a-1];//1到b的距離減去到a的距離
		ans=min(ans,d[n]-ans);//d[n]-ans表示a到b之外的距離
		cout<<ans<<endl;
	}
	return 0;
}
/***
5 1 2 4 14 9
3
1 3
2 5
4 1

 */

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章