【PAT】A1046 Shortest Distance【简单模拟】

本文介绍了一种解决环形高速公路上任意两点间最短距离问题的算法。通过预处理存储各点间的累积距离,实现快速查询。适用于N个点构成的简单环路,查询复杂度低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.

Input Specification:

Each input file contains one test case. For each case, the first line contains an integer N (in [3,10^​5​​ ]), followed by N integer distances D​1​​ D​2​​ ⋯ D​N​​ , where D​i​​ is the distance between the i-th and the (i+1)-st exits, and DN
​​ is between the N-th and the 1st exits. All the numbers in a line are separated by a space. The second line gives a positive integer M (≤10^​4​​ ), with M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 to N. It is guaranteed that the total round trip distance is no more than 10^​7
​​ .

Output Specification:

For each test case, print your results in M lines, each contains the shortest distance between the corresponding given pair of exits.

Sample Input:

5 1 2 4 14 9
3
1 3
2 5
4 1

Sample Output:

3
10
7

题意

给出有N个点的一个简单环和N个点之间的距离(最后一个数据为最后一个点到第一个点的距离),所有点编号为1~N。给出M个查询,求每个查询中一对点之间的最短距离。

思路

环上两个点之间的最短距离要么是从左端点直接到右端点,要么是从右端点到起始端点再走到左端点。所以我们用a[i]表示从1号到i+1号的距离。为了方便代码的书写,我们将编号映射到0~N-1。这样a[i]表示从0号到i号的距离(i = 1,…,N-1),所以a[0]为0号到自身的距离,当然就是0了,那么a[N]代表从N-1号到0号的距离。所以我们初始化a[0] = 0,然后边读入边依次计算从0号到第i号的距离。得到a数组后。对于M个查询,只需要再次将输入的两个点映射到0~N-1上,为了方便,总是取u为编号大的一个,v为编号小的一个。然后输出a[u] - a[v]和a[N] + a[v] - a[u]中小的一个。

代码

#include <cstdio>
#include <algorithm>
#define MAX_N 100000
using namespace std;
int a[MAX_N + 1];
int main() {
    // 读取输入并计算a[i](i = 1,2...,N)
    // a[i]代表从0号位置到i号位置的总距离
    int N;
    scanf("%d", &N);
    a[0] = 0;
    for(int i = 1, t; i <= N; i++){
        scanf("%d", &t);
        a[i] = a[i - 1] + t;
    }
    
    int M;
    scanf("%d", &M);
    for(int i = 0, u, v, t; i < M; i++){
        scanf("%d %d", &u, &v);
        // 交换编号(如果需要)使得u总是大于等于v,并将u、v映射到编号为0~N-1的空间
        if(u > v){
            t = u - 1;
            u = v - 1;
            v = t;
        }else{
            u--;
            v--;
        }
        
        // 输出答案,最短距离要么是从v->u,要么是从u->N->v
        printf("%d\n", min(a[v] - a[u], a[N] + a[u] - a[v]));
    }
    return 0;
}

<think&gt;好的,我现在需要帮用户了解荣耀平板的分屏操作教程。首先,用户提到他们参考了三个引用内容,其中引用[1]是关于将平板作为笔记本电脑分屏的教程,引用[2]和[3]是关于荣耀平板2的评测和对比。用户的问题是如何在荣耀平板上进行分屏操作,而不是作为外接分屏设备使用。所以需要先确定用户是想知道平板自身应用分屏,还是作为笔记本的副屏。不过根据用户的问题“荣耀平板分屏操作方法”,应该是指平板本身的多任务分屏功能。 接下来,我需要回忆一下华为/荣耀平板的分屏操作步骤。通常安卓平板的分屏方法有两种:通过最近任务视图启动分屏,或者通过手势操作。例如,在支持多窗口的系统中,用户可以长按应用卡片选择分屏,或者使用三指上滑等手势。但不同型号和系统版本可能操作略有不同,比如EMUI或Magic UI的不同版本。 根据引用[1],用户提到的教程是将平板作为笔记本的分屏,这需要软件如Spacedesk或Splashtop,但用户现在的问题是关于平板自身分屏,所以需要排除这部分,专注于平板内部分屏功能。引用[2]和[3]提到荣耀平板2的发布信息,可能系统版本较旧,所以需要考虑当时的系统是否支持分屏,以及现在可能的更新情况。 可能需要指出分屏操作的具体步骤,例如:1. 打开第一个应用;2. 进入多任务视图;3. 选择分屏;4. 选择第二个应用。同时,需要注意是否有特定手势,如侧边栏滑动打开第二个应用。此外,有些应用可能不支持分屏,需要提醒用户注意这一点。 另外,需要确认荣耀平板的系统是否基于EMUI,以及不同版本的分屏操作是否有差异。例如,EMUI 10可能支持智慧分屏,而更早的版本可能通过长按多任务键。由于引用中提到的是荣耀平板2,发布时间是2016年,可能搭载的是EMUI 4.x或5.x,这时候的分屏操作可能与现在不同。但考虑到用户可能现在使用的较新型号,所以可能需要覆盖通用步骤和可能的版本差异。 最后,需要以清晰的结构分步骤说明,并指出可能的注意事项,比如应用兼容性,调整分屏比例等。如果有引用相关内容,需要正确标注,但根据提供的引用内容,引用[1]是关于外接分屏,引用[2][3]是产品介绍,可能没有直接的分屏操作步骤,因此可能无法直接引用,但需要确保回答准确。</think&gt;### 荣耀平板分屏操作教程 荣耀平板的分屏功能允许用户同时使用两个应用,提升多任务处理效率。以下是详细操作步骤(以EMUI或Magic UI系统为例): #### **方法一:手势分屏** 1. **打开第一个应用** 正常启动需要使用的第一个应用(如浏览器、文档编辑器等)。 2. **激活分屏模式** - 从屏幕左/右侧边缘向**内滑动并停顿**,调出侧边栏[^2]。 - 在侧边栏中选择第二个应用,拖动到屏幕空白区域即可实现分屏。 3. **调整分屏比例** 按住中间的**分界线**上下滑动,可调整两个应用的显示比例。 #### **方法二:最近任务分屏** 1. **进入多任务视图** 点击屏幕底部的**方形虚拟按键**(或上滑悬停)进入最近任务界面。 2. **选择分屏应用** - 长按需要分屏的**应用卡片**,点击弹出的「分屏」图标[^3]。 - 随后选择第二个应用,系统会自动分屏显示。 #### **注意事项** - **兼容性**:部分应用不支持分屏模式,需根据系统提示操作。 - **退出分屏**:拖动分界线至屏幕顶部或底部可关闭对应应用的分屏。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值