首页 > 试题广场 >

小美走公路

[编程题]小美走公路
  • 热度指数:2830 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
有一个环形的公路,上面共有n站,现在给定了顺时针第i站到第i+1站之间的距离(特殊的,也给出了第n站到第 1 站的距离)。小美想沿着公路第x站走到第y站,她想知道最短的距离是多少?

输入描述:
第一行输入一个正整数n,代表站的数量。
第二行输入n个正整数a_i,前n-1个数代表顺时针沿着公路走,i站到第i+1站之间的距离;最后一个正整数代表顺时针沿着公路走,第n站到第 1 站的距离。·
第三行输入两个正整数xy,代表小美的出发地和目的地。
1\leq n \leq 10^5
1\leq a_i \leq 10^9
1\leq x,y \leq n


输出描述:
一个正整数,代表小美走的最短距离。
示例1

输入

3
1 2 2
2 3

输出

2
示例2

输入

3
1 2 2
1 3

输出

2
import java.util.*;

/**
 * @author ayj
 * @date 2023/9/11
 * @Description 美团2024届秋招笔试第一场编程真题
 */
public class Main {
    private static final Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        question06();
    }

  private static void question06() {
    int n = sc.nextInt();
    long[] preSum = new long[n];
    for (int i = 0; i < n; i++) {
      preSum[i] = sc.nextLong();
      if (i != 0) {
        preSum[i] += preSum[i - 1];
      }
    }
    int x = sc.nextInt() - 1;
    int y = sc.nextInt() - 1;
    if (x > y) {
      x = x ^ y;
      y = x ^ y;
      x = x ^ y;
    }
    long leftDis = x > 0 ? preSum[y - 1] - preSum[x - 1] : preSum[y - 1];
    long rightDis = preSum[n - 1] - preSum[y - 1];
    if(x > 0){
      rightDis += preSum[x - 1];
    }
    System.out.println(Math.min(leftDis, rightDis));
  }
}

发表于 2023-09-12 18:54:03 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            Long[] a = new Long[n];
            for(int i = 0; i < n; i++) {
                a[i] = in.nextLong();
            }
            Long x = in.nextLong() - 1;
            Long y = in.nextLong() - 1;
            if(x > y) {
                Long t = x;
                x = y;
                y = t;
            }
            if(x == y) {
                System.out.print(0);
                return;
            }
            Long sum1 = Long.valueOf(0);
            Long sum2 = Long.valueOf(0);
            for(int i = 0; i < n; i++) {
                if((x + i) != y) {
                    sum1 += a[(int) (x + i)];
                }else {
                    break;
                }
            }
            for(int i = 0; i < n; i++) {
                if((y + i) % n != x) {
                    sum2 += a[(int) ((y + i) % n)];
                }else {
                    break;
                }
            }
            System.out.println(Math.min(sum1, sum2));
        }
    }
}
发表于 2023-08-22 16:41:36 回复(0)