NC207040 丢手绢

题目

题目描述

“丢丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她。”

牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的游戏,但是小朋友们太小了,不能围成一个均匀的圆圈,即每个小朋友的间隔可能会不一致。为了大家能够愉快的玩耍,我们需要知道离得最远的两个小朋友离得有多远(如果太远的话牛老师就要来帮忙调整队形啦!)。

因为是玩丢手绢,所以小朋友只能沿着圆圈外围跑,所以我们定义两个小朋友的距离为沿着圆圈顺时针走或者逆时针走的最近距离。

输入描述

第一行一个整数 \(N\) ,表示有 \(N\) 个小朋友玩丢手绢的游戏。

接下来的第 \(2\) 到第 \(n\) 行,第 \(i\) 行有一个整数,表示第 \(i-1\) 个小朋友顺时针到第 \(i\) 个小朋友的距离。

最后一行是第 \(N\) 个小朋友顺时针到第一个小朋友的距离。

输出描述

输出一个整数,为离得最远的两个小朋友的距离。

示例1

输入

3
1
2
3

输出

3

备注

\(2 \leq N \leq 100000\)

距离和(圆圈周长)小于等于 \(2147483647\)

题解

思路

知识点:尺取法。

假设孩子 \(i\) 到孩子 \(j\) 的某时针距离过半,则其实际距离是总距离减去这个距离,并且一定是反向最长距离,所以只需要枚举到距离过半就行。

并且满足之后 \(i+1\) 后,不需要将 \(j\) 指向位置复位到 \(i+2\) ,因为 \(j\) 在原位的位置一定比 \(i\) 到 \(j\) 距离小,一定不是最大距离。

此时有两个方法:枚举 \([1,n]\) 每个起点的单方向最大值(成环);枚举 \([1,n]\) 每个起点,且右端点不环绕数组的双向最大值。

个人认为环状求取单方向距离,从而等价得到双向距离更好。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int a[100007];
int len; int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i = 0;i<n;i++){
cin>>a[i];
len += a[i];
}
int ans = 0;
int sum = 0;
int l = 0,r = 0;
///个人认为环状求取单方向距离,从而等价得到双向距离更好
while(l<n){
while(sum<len/2){///不能等于因为要刚好过半,刚好等于一半时,再加会小,就丢失了一半的可能性
sum+=a[r++%n];///r必须成环因为,下面判断方式只能枚举一个点可能最大距离中的逆时针最大距离,不成环枚举到对称点就无法得到相对的顺时针最大距离
}
ans = max(ans,min(sum,len-sum));///min(sum,len-sum)因为sum等于len/2时,可能还是会小于len的一半,此时取sum;sum大于len/2时,sum一定大于len的一半,此时取sum-len
sum -= a[l++];
}
/*
while(l<n){
while(r<n && sum <= len/2){///算上等于sum最后一定超过一半
sum+=a[r++];///此种判断可以不成环,因为每次都算了一个点到两种可能点的最大距离,那么R回到1以后实际上得到距离是一样的就不用再看了
}
if(sum>len/2) ans = max(ans,max(len-sum,sum-a[r-1]));///不成环就需要在最后判断sum有没有超过一半,为了防止R终止以后sum小于一半造成错误答案
sum -= a[l++];
}*/
cout<<ans<<'\n';
return 0;
}

最新文章

  1. 花几分钟搭建一个自已的GIT服务器
  2. 使用Grunt 插件打包Electron Windows应用
  3. 面向对象的 CSS (OOCSS)
  4. ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流
  5. objc_msgSend iOS8 EXC_BAD_ACCESS
  6. 最近用的几个sql语句
  7. interbase C++Builder 简单例子
  8. nopcommerce插件使用
  9. 小程序--改变子级别页面导航栏信息 / navigationBarTitleText
  10. Java笔记(day11)
  11. 一文读懂MapReduce
  12. uniapp仿h5+fire自定义事件触发监听
  13. linux 开放80端口
  14. Spring Boot Starters 列表
  15. Python import模块
  16. 合理配置SQLSERVER内存
  17. Codeforces Round #541 (Div. 2) G dp + 思维 + 单调栈 or 链表 (连锁反应)
  18. Qt在控件未显示时如何获取正确的控件尺寸
  19. PHP也玩并发,巧用curl 并发减少后端访问时间
  20. Android:AS与Unity3D之间打包的各种坑及解决方案

热门文章

  1. 别像弱智一样提问 Stop-Ask-Questions-The-Stupid-Ways
  2. jointJS初使用随记
  3. 甲骨文严查Java授权,换openJDK要避坑
  4. 如何设计一个良好的API接口?
  5. 谈谈ThreadLocal的应用场景和注意事项?
  6. vscode设置vue文件高亮显示
  7. [AcWing 75] 和为S的两个数字
  8. [RPC学习]Dubbo+nacos实现动态更新内存RTree
  9. QY-19 GNSS位移监测站 地质灾害在线监测-实时预警
  10. selenium模块 phantomJs 谷歌无可视界面