原题链接:PTA | 程序设计类实验辅助教学平台
题目(图片):
Sample Input
5 1 2 4 14 9
3
1 3
2 5
4 1
思路:
按照题意模拟,注意时间复杂度
代码:
超时代码: 种方法不行,因为如果极端情况有10^5个点 10^4次查下 就会有10^9次操作,无法在100ms完成
#include <bits/stdc++.h>
using namespace std;
const int MAX=100010;
int main()
{
int n,v[MAX],k,sum=0;//v[i]代表i到i+1的距离,(i+1)<=n
cin>>n;
for(int i=1;i<=n;i++){
cin>>v[i];
sum+=v[i];
}
cin>>k;
for(int i=1;i<=k;i++){//查询
int x,y;cin>>x>>y;
int left=0,right=0;
if(x>y) swap(x,y);
for(int i=x;i<y;i++){
right+=v[i];
}
left=sum-right;
cout<<min(left,right)<<endl;
}
return 0;
}
ac代码:引入dis数组,减少一个for循环
#include <bits/stdc++.h>
using namespace std;
const int MAX=100010;
int main()
{
int n,dis[MAX],v[MAX],k,sum=0;//v[i]代表i到i+1的距离,(i+1)<=n ,dis[i]表示从1号点到i号点的距离
cin>>n;
for(int i=1;i<=n;i++){
cin>>v[i];
sum+=v[i];
dis[i]=sum;
}
cin>>k;
for(int i=1;i<=k;i++){//查询
int x,y;cin>>x>>y;
int left=0,right=0;
if(x<y) swap(x,y);
right=dis[x-1]-dis[y-1];
left=sum-right;
cout<<min(left,right)<<endl;
}
return 0;
}
注意要点:
注意时间复杂度,小心超时