CF 278A.Circle Line
题目分析
输入n个数据作为路径,求从a到b的最短距离,需要将其相成一个圆圈,既可以从小往大走又可以从大往小走
思路分析
依然将数据存为数组,通过下标进行操作,既然说了有两种方式那就计算两种方式哪个更快就输出谁
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();//数据量
sc.nextLine();//吞回车
int[] arr=new int[n];//存储数据距离
for (int i = 0; i < n; i++) {
arr[i]=sc.nextInt();//存值
}
sc.nextLine();//吞回车
int s= sc.nextInt();//站点a
int t= sc.nextInt();//站点b
//无论是a到b,还是b到a,由于是一个圆圈实质可以都是从a到b,所以我统一改为从最小站点到大站点
int temp=s;//临时存储s
s=Math.min(s,t);//设定s为存储小站点
t=Math.max(temp,t);//设定t存储大站点
int re1=0;//第一种方式答案从小到大
int re2=0;//第二种方式答案从大到小
for (int i = s-1; i <t-1 ; i++) {//从小到大
re1+=arr[i];//因为这里不涉及溢出下标,所以直接顺序累加即可
}
for (int i = t-1; i <s-1+n ; i++) {//这里是从大到小,当到达n下标时实际用0,粗浅的看成一条直线可知i的最大值需要+一个n,确保不会限制i累加
//当下标位于n时实际是0,n+1时实际是1,所以当未溢出时不用修改
int j=i;
if (i>=n){//当i溢出时,只需要对n取模就可以获得正确下标
j=i%n;
}
//此处需要使用j来做下标,如果用i就会造成数据冲突进入死循环
re2+=arr[j];
}
System.out.println(Math.min(re1,re2));//判断最小答案输出
}
}
感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。