題源: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
*/