PAT 1046 Shortest Distance (20分) TL ,超时如何解决

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;
} 

在这里插入图片描述
在这里插入图片描述

思路重点:

  1. 需要比较顺时针,逆时针两个不同方向的距离,只需要算出其中一个,然后让总和减去其中一个即可。
  2. 在进行距离总和计算时,可以直接单个点到第一个点的距离求出,dis[i].

特殊情况:

题目的特殊情况考虑是自己黑盒测试的一部分

  1. 运行超时,在极端情况下,遍历数组105,共有104个查询,因此最后会有109,因此超时。
  2. 没有规定两个点之间的大小,因此需要比较左边与右边值的大小。
  3. 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 ̄)づ╭❤~
关注我和我一起共勉加油吧!
如果文章有错误,还望不吝指教!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值