关注
受到杨超度同学思路的启发,我觉得这道题可以这样想,需要一个先验知识:X轴上有N个点,求X轴上一点使它到这N个点的距离之和最小。那么根据中位数性质,这个点一定是这组数中的中位数(该性质的简单证明可以参考https://blog.csdn.net/sm_545/article/details/78196351)。 这道题在先验知识的基础上有两个变形,首先题目要求是环,那么我们就在这N个数后面再补上N个数(其中新加的N个数分别是前N个数加环的长度L)然后我们从中截取N段,使得每段都包含了所有的数,分别对每段应用先验知识;其次题目要求移动到相邻位置,那就在先验知识的基础上减去一个常数即可。因为一旦N给定,这个常数就确定了(具体求法见下方代码) public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int result = Integer.MAX_VALUE;
int L = sc.nextInt(); //项链的长度
int N = sc.nextInt(); //珍珠的个数
int[] nums = new int[2*N+1]; //存拓展后的珍珠位置编号
int m, constant = 0;
m = (N+1) / 2;
for(int i = 1; i <= N ; i++){
nums[i] = sc.nextInt();
constant += Math.abs(m - i); //求先验知识和本题差的那个常数
}
Arrays.sort(nums, 1, N+1); //排序前N个数
for(int i = N+1; i <=2*N; i++) {
nums[i] = nums[i - N] + L; //拓展,补上N个数
}
for(int left = 1; left <= N; left++){ //截取N段,每段包含了所有的珍珠
int answer = 0; //按照先验知识求的距离和
int right = left + N-1;
int i = left, j = right;
while(i <= j){
answer += nums[j--] - nums[i++];
}
result = Math.min(answer - constant, result);
}
System.out.println(result);
}
查看原帖
点赞 1
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 2025年终总结 #
146951次浏览 2514人参与
# 秋招落幕,你是He or Be #
3124次浏览 76人参与
# 应届生进小公司有什么影响吗 #
109041次浏览 1116人参与
# 比亚迪工作体验 #
70063次浏览 254人参与
# 你面试体验感最差/最好的公司 #
2949次浏览 56人参与
# 工作中听到最受打击的一句话 #
2477次浏览 61人参与
# 大厂VS公务员你怎么选 #
71055次浏览 660人参与
# 重来一次,你会对开始求职的自己说 #
2903次浏览 71人参与
# 一人说一个提前实习的好处 #
3276次浏览 70人参与
# 团建是“福利”还是是 “渡劫” #
3972次浏览 110人参与
# 实习没事做是福还是祸? #
8154次浏览 135人参与
# 如何排解工作中的焦虑 #
243679次浏览 2241人参与
# 从顶到拉给所有面过的公司评分 #
144782次浏览 518人参与
# 今年你最想重开的一场面试是? #
1367次浏览 24人参与
# 你小心翼翼的闯过多大的祸? #
6857次浏览 109人参与
# 联影求职进展汇总 #
123816次浏览 781人参与
# OPPO求职进展汇总 #
755869次浏览 5390人参与
# 互联网公司爆料 #
158557次浏览 724人参与
# 产品实习,你更倾向大公司or小公司 #
189078次浏览 2053人参与
# 秋招结束之后的日子 #
113892次浏览 1038人参与