题目意思,一个圆形闭环内,有n个点,给了每个点到下一个点的距离,然后让你求得给出的点之间的距离
刚开始的想法是把这个点顺时针和逆时针分别走一趟,判别那种最小,但是这种做法,最后一个例子可能会超时,以下为源代码
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int n,m;
int a[100010];
cin>>n;
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
cin>>m;
for(int i=0;i<m;i++)
{
int b,c,sum=0;
cin>>b>>c;
int p=b,q=c;
int min=10000010;
while(p!=q)
{
sum+=a[q++];
if (q>5)
q%=5;
}
if (sum<min)
min=sum;
sum=0;
p=b,q=c;
while(p!=q)
{
sum+=a[p++];
if (p>5)
p%=5;
}
if (sum<min)
min=sum;
printf("%d\n",min);
}
}
此代码在pat测试平台上分数为17分。
改进后结果
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=100010;
int main()
{
int n,m,a,dis[maxn],sum=0;
cin>>n;
for (int i=1;i<=n;i++)
{
scanf("%d",&a);
sum+=a;
dis[i]=sum;
}
cin>>m;
for (int i=0;i<m;i++)
{
int dis1,dis2;
cin>>dis1>>dis2;
if(dis1>dis2)
swap(dis1,dis2);
int temp=dis[dis2-1]-dis[dis1-1];//这个地方为dis-1.因为该出的dis并不是该点到达的距离而是下一点到达的距离
if (temp>sum-temp)
temp=sum-temp;
printf("%d\n",temp);
}
}
改进后的思路是采用闭环的特有性质比较。