1046 Shortest Distance (20分)
题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805435700199424
1.补充知识:
1.1时间复杂度:
对于一般的oj系统来说,一秒能承受的运算次数大概是107~108。
1.2循环体的遍历
对于循环数据的题目如何遍历,需要分两种情况:
1.顺时针(递增方向):
j++;
j = j%n //n 表示循环体长度
2.逆时针(递减方向):
k += (n-1); //-1主要针对起始点为0,对于起始点为1则表示为-2
k = k%n;
2.代码(TL):
#include <cstdio>
#include <iostream>
using namespace std;
const int mMax = 100010;
int l,r,n,m;
int a[mMax];
int main(){
int total = 0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
total +=a[i];
}
scanf("%d",&m);
for(int i=0;i<m;i++){
int sum1 = 0,sum2 = 0,sum;
scanf("%d%d",&l,&r);
r--;
int j=--l,k=(l+(n-1))%n;
while(j!=r){
sum1 += a[j];
j++;
j = j%n;
}
/*while(k!=(r+(n-1))%n){
sum2 += a[k];
k += (n-1);
k = k%n;
}*/
sum2 = total -sum1;
sum = (sum1>sum2)?sum2:sum1;
printf("%d\n",sum);
}
return 0;
}
思路重点:
- 需要比较顺时针,逆时针两个不同方向的距离,只需要算出其中一个,然后让总和减去其中一个即可。
- 在进行距离总和计算时,可以直接单个点到第一个点的距离求出,dis[i].
特殊情况:
题目的特殊情况考虑是自己黑盒测试的一部分
- 运行超时,在极端情况下,遍历数组105,共有104个查询,因此最后会有109,因此超时。
- 没有规定两个点之间的大小,因此需要比较左边与右边值的大小。
- dis[i].编号起始点的设置,让了让第一个点距离等于0,因此起始点从1开始,那dis[0] = 0;
2.代码(AC):
#include <cstdio>
#include <iostream>
using namespace std;
const int mMax = 100010;
int l,r,n,m;
int a[mMax]={0},dis[mMax]={0};
int main(){
int total = 0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
total +=a[i];
dis[i] = total;
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d%d",&l,&r);
--l;--r;
if(r<l){
int t = r;
r = l;
l = t;
}
int sum1 = 0,sum2 = 0,sum;
sum1 = dis[r]-dis[l];
sum2 = total -sum1;
sum = (sum1>sum2)?sum2:sum1;
printf("%d\n",sum);
}
return 0;
}
勉励
打卡第八天,加油ヾ(◍°∇°◍)ノ゙
如果觉得我的文章对你有所帮助与启发,点赞给我个鼓励吧(づ ̄3 ̄)づ╭❤~
关注我和我一起共勉加油
吧!
如果文章有错误,还望不吝指教!