ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AT3978 题解

2022-08-25 00:32:11  阅读:122  来源: 互联网

标签:路程 int 题解 代码 AT3978 答案 include


题目传送门

小学生又双叒叕来写题解啦!

这题的题面有误,讨论区有人提出来了,望管理员修改一下。

我就不发正确的题目描述了,自己去讨论区看看。


不说闲话,我看到题目的第一反应是:直接模拟不就好了!

于是写出了如下代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#define N (int)(1e5 + 5)
using namespace std;
int n, a[N]; 
int dis(int x)  //表示不用去第 x 个点的最短路程。 
{
	int ans = 0, now = 0;  //分别记录答案与当前位置。 
	for (int i = 1; i <= n+1; i++) 
	//看到 i 的范围了吗,由于第 (n+1) 个是零,我们直接遍历到那里,不就相当于回到零号点了吗? 
	{
		if (i == x) continue;
		ans += (abs(now - a[i]));
		now = a[i];
	}
	return ans;
}
int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (int i = 1; i <= n; i++) printf("%d\n", dis(i));  //勿忘祖传换行。 
	return 0;
}

然而第一个点就爆掉了,原因是超时。

超时的原因很简单,就是这份代码的时间复杂度是 \(O(n^2)\) 这么大,不爆才怪呢!

因此,我们可以预处理

准确的说,由于每次计算最短路程是相关的,所以思考:能否通过整体的一次计算来得到所有答案呢?

答案是可以的。

首先算出完整路程,也就是没有点被省略时的路程。

然后,假设第 \(i\) 个点不用去,那么只需在完整路程中减去一些东西就是结果了。

具体看这两张图。

图一

如果省略第一个点,就会变成下图。

图二

代码也就水到渠成了。

送上满分代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#define N (int)(1e5 + 5)
using namespace std;
int n, a[N]; 
int dis()  //表示最短路程。 
{
	int ans = 0, now = 0;  //分别记录答案与当前位置。 
	for (int i = 1; i <= n+1; i++) 
	//看到 i 的范围了吗,由于第 (n+1) 个是零,我们直接遍历到那里,不就相当于回到零号点了吗? 
	{
		ans += (abs(now - a[i]));
		now = a[i];
	}
	return ans;
}
int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	int s = dis();
	for (int i = 1; i <= n; i++) 
	{
		//关于下面重点代码的解析,图内都标好了,对着图模拟即可。 
		int t1 = abs(a[i] - a[i-1]);
		int t2 = abs(a[i] - a[i+1]);
		int t3 = abs(a[i-1] - a[i+1]);
		printf("%d\n", s - t1 - t2 + t3);  //勿忘祖传换行。 
	}
	return 0;
}

首发:2022-02-06 19:15:58

标签:路程,int,题解,代码,AT3978,答案,include
来源: https://www.cnblogs.com/liangbowen/p/16622807.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有