昨天做了俩道补题,感觉很自己有点无脑了
一、镜像最短距离
思路
首先这道题我最开始想的是bfs记录步数来做的,当时测试的时候没写出来,后来,看补题的时候,才发现这个就是简单的数学问题,我们只要计算出初始点到终点的起始的x轴坐标之差最小值和y轴坐标之差最小值,然后再相加,就可以得到它的最短距离了,要注意的是它可以穿越,而且数据范围很大
代码实现
#include<stdio.h>
#include<math.h>
long long min(long long a, long long b) {
return a < b?a : b;
}
int main()
{
int T;
long long int m, n;
long long int x1, x2, y1, y2;
long long int s1, s2, s3, s4;
scanf("%lld %lld", &n, &m);
scanf("%lld %lld %lld %lld", &x1, &y1, &x2, &y2);
s1 = fabs(x2 - x1) + fabs(y2 - y1);
s2 = n - fabs(x2 - x1) + m - fabs(y2 - y1);
s3 = fabs(x2 - x1) + m - fabs(y2 - y1);
s4 = n - fabs(x2 - x1) + fabs(y2 - y1);
long long int minn = s1;
minn = min(minn, s2);
minn = min(minn, s3);
minn = min(minn, s4);
printf("%lld\n", minn);
}
二、友谊考验
思路
这个题我用的是枚举暴力,答案肯定是超时的,但是我也想不出更好的办法,然后后来就看了补题,可以用前段和来做的,我对这个一点也没有印象,以前肯定是做过的,但是最近就没有刷题,然后就忘了,由此可凸显出刷题的重要性
就以题目例子为例吧
可以发现对应下标下就是1下标到对应下标的元素和,当我们得出这个东西之后,就可以轻松得到你想要的区间和
那么2到4的区间和就是 sum = x [ 4 ] - x [ 2 - 1 ] ,也就是 sum = x[ a ] - x [ b - 1] ;
还有就是要注意的是,这个题的数据范围
代码实现
#include<stdio.h>
unsigned long long x[100005];
int main()
{
int n, q, i, j, a, b;
long long sum=0;
scanf("%d %d", &n, &q);
for (i = 1; i <= n; i++)scanf("%llu", &x[i]);
for (i = 1; i <= n; i++)
{
sum += x[i];
x[i] = sum;
}
while (q--)
{
scanf("%d %d", &a, &b);
printf("%llu\n", x[b] - x[a - 1]);
}
}