输入描述:
第一行一个整数N,表示有N个小朋友玩丢手绢的游戏。
接下来的第2到第n行,第i行有一个整数,表示第i-1个小朋友顺时针到第i个小朋友的距离。
最后一行是第N个小朋友顺时针到第一个小朋友的距离。
输出描述:
输出一个整数,为离得最远的两个小朋友的距离。
分析
对于围成的圆圈,最长的距离就是直径上两端点的距离,因此两个小朋友的距离要尽可能远。只需要枚举每一个小朋友,然后找到与他在同一直径上的小朋友。
具体使用尺取法,尺内大小保持一半的周长。枚举每一个小朋友确定第一个端点,移动右指针,当距离达到或大于一半周长时,即找到与他在同一直径上的小朋友。根据题意,取顺时针或逆时针最小的一个更新当前最大值,然后移动左指针。需要的注意的是圆圈是环,右指针达到N时置重新最开始位置
AC
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
int[] arr = new int[N];
int sum = 0;
for(int i = 0; i < N; ++i) {
arr[i] = Integer.parseInt(bf.readLine());
sum += arr[i];
}
final int half = sum / 2;
int max = Integer.MIN_VALUE;
int i = 0, j = 0, cur = 0;
while(i < N) {
while(true) {
cur += arr[j];
if(cur >= half) {
max = Math.max(max, Math.min(cur, sum - cur));
cur -= arr[i++];//移动左指针
cur -= arr[j];//多加了一次,需要减掉
break;
} else {
if(++j == N)
j = 0;
}
}
}
System.out.println(max);
}
}
链接:https://ac.nowcoder.com/acm/contest/20960/1030
来源:牛客网
标签:手绢,arr,cur,int,max,圆圈,小朋友 来源: https://www.cnblogs.com/brbrbr/p/15881450.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。