一、可借鉴的
1. 超时原因
这道题的测试点三一直超时,原因是我的方法复杂度是O(n^2),而算法笔记上的解法只有O(n)
2. 使用algorithm库
swap()和min()
3. 一行内输入数据仍按原方法
二、代码
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805435700199424
1. 算法笔记‘s
优化的地方是提前计算出1到各个点的距离(dist数组),要求某两点的距离则让其相减即可
#include<cstdio>#include<algorithm>using namespace std;const int MAXN = 100005;int dis[MAXN],A[MAXN];//dis存放顺时针方向的距离,A存放i到i+1的距离int main(){int sum = 0,query,n,left,right;scanf("%d",&n);for(int i = 1;i <= n;i++){scanf("%d",&A[i]);sum += A[i];dis[i] = sum;}scanf("%d",&query);for (int i = 0;i<query;i++){scanf("%d%d",&left,&right);if(left>right) swap(left,right);int temp = dis[right-1] - dis[left-1];printf("%d\n",min(temp,sum - temp));}return 0;}
2. 俺写的
#include<cstdio>
int main(){
int N = 0,M = 0;
int A = 0,B = 0;
int sum1 = 0,sum2 = 0;
int dist[100000] = {0};
scanf("%d",&N);
for(int i = 1;i <= N;i++)
{
scanf("%d",&dist[i]);
}
//printf("N是%d\n",N);
scanf("%d",&M);
for(int i = 1;i <= M;i++)
{
//printf("dist[%d] = %d\n",i,dist[i]);
scanf("%d %d",&A,&B);
int k1 = A,k2 = B;
int sum1 = 0,sum2 = 0;
while(k1!=B)
{
sum1 = dist[k1] + sum1;
k1 = k1%N+1;
}
while(k2!=A)
{
sum2 = dist[k2] + sum2;
k2 = k2%N+1;
}
printf("%d",sum1<sum2?sum1:sum2);
if (i!=M){printf("\n");}
}
return 0;
}
