方法1
先用数组记录前缀后,然后减去两者的差值。
由于数组形成的是个环,所以累加和是固定的,反方向的距离实际就等于总长度减去正向的长度。
#include<cstdio>
const int maxn=1e5+5;
int cost[maxn];
int dp[maxn];
int n;
void swap(int& x,int& y){
int t=x;x=y;y=t;
}
int min(int a,int b){
return a<b?a:b;
}
int main(){
scanf("%d",&n);
int sum=0;
dp[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&cost[i]);
sum += cost[i];
dp[i]= dp[i-1]+cost[i];
}
int m,st,ed;
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d%d",&st,&ed);
if(st > ed) swap(st,ed);
int ans =dp[ed-1] - dp[st-1];
printf("%d\n",min(ans,sum - ans));
}
return 0;
}
方法2
有点像笨比,最后一个测试点超时了。
这里主要是记录一下如何计算循环链表或数组中的值
17分
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
int cost[maxn];
int n;
void swap(int& x,int& y){
int t=x;x=y;y=t;
}
int min(int a,int b){
return a<b?a:b;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&cost[i]);
}
cost[0]=cost[n];
int m,st,ed;
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d%d",&st,&ed);
if(st > ed) swap(st,ed);
int ans1 =0;
for(int j=st;j<ed;j++){
ans1 +=cost[j];
}
int ans2 =0;
for(int j=ed;(j+n)%n != st;j++){
ans2 += cost[(j+n)%n];
}
printf("%d\n",min(ans1,ans2));
}
return 0;
}