#include<iostream>
#include<math.h>
using namespace std;
const int INF =
1e9;
const int MAXN =
3*
1e5;
int cost[MAXN], val[MAXN];
int N, num, a, b;
int main() {
cin >>
N;
for(
int i =
1; i <= N;i++
) {
cin >>
num;
val[i] = val[N+i] =
num;
}
for(
int i =
1; i <=
2*N; i++
) {
cost[i] = val[i] + cost[i-
1];
}
cin >>
num;
while(num--
) {
cin >> a >>
b;
if(abs(a-b) ==
1) {
int temp =
min(a,b);
cout << val[temp] <<
endl;
}else {
if(a >
b) swap(a,b);
int temp = min(cost[b-
1] - cost[a] + val[a], cost[N+a-
1] - cost[b] +
val[b]) ;
cout << temp <<
endl;
}
}
}
对于循环数组,可以将数组复制一倍。 思路源自 首位相连的数组的最大连续子段和
转载于:https://www.cnblogs.com/dcklm/p/10351439.html