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;
}

NC207040 丢手绢的更多相关文章

  1. python玩丢手绢问题,出局的顺序

    # 丢手绢问题# 游戏规则: 有N个小朋友玩丢手绢游戏,做成一圈,从第一个小朋友开始数数,从一开始数,数到指定数字的小朋友要出列,然后下一个小朋友继续从1开始数,依次类推,算出最后一个留下来的小朋友是 ...

  2. HOJ———丢手绢

    hide handkerchief Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  3. 丢手绢问题(约瑟夫问题)的python实现

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. def fnA(p, personNum, cnt): times = cnt // pe ...

  4. Josephus problem(约瑟夫问题,丢手绢问题)

    约瑟夫问题 约瑟夫环问题是一个数学应用题:已知n个人(以编号1,2,3.....,n)围坐在一张圆桌的周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列 ...

  5. ZJNU 1531 - 丢手绢--中级

    可以将相同的人数分块存在数组gp中先 例如RRGGGRBBBBRR 则gp[1~5]={2,3,1,4,2} 首先可以知道,如果要让没有相邻的相同,只需要每个gp[i]/2向下取整即可得出最少需要改变 ...

  6. 数学--数论--HDU 2104 丢手绢(离散数学 mod N+ 剩余类 生成元)+(最大公约数)

    The Children's Day has passed for some days .Has you remembered something happened at your childhood ...

  7. Java 解决约瑟夫问题

    约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称“丢手绢问题”.) 有这样一个故事,15个教徒和15个非教徒在深海遇险必须讲 ...

  8. 约瑟夫问题(Josephus Problem)的两种快速递归算法

    博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称 ...

  9. 约瑟夫问题-Josephus--及实例说明

    //---我保证所有的代码都已经通过测试---// 类似约瑟夫的问题又称为约瑟夫环.又称“丢手绢问题”. 这个问题来自于这样的一个关于著名犹太历史学家 Josephus传说: 在罗马人占领乔塔帕特后, ...

随机推荐

  1. Java语言学习day19--7月25日

    今日内容介绍1.继承2.抽象类3.综合案例---员工类系列定义 ###01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在Jav ...

  2. 『现学现忘』Git基础 — 8、Git创建本地版本库

    目录 1.Git版本库介绍 2.创建本地版本库 场景一:创建一个空的本地版本库. 场景二:项目中已存在文件时,创建该项目的本地版本库. 场景三:在GitHub网站上创建仓库,克隆到本地. 1.Git版 ...

  3. Unity实现A*寻路算法学习1.0

    一.A*寻路算法的原理 如果现在地图上存在两点A.B,这里设A为起点,B为目标点(终点) 这里为每一个地图节点定义了三个值 gCost:距离起点的Cost(距离) hCost:距离目标点的Cost(距 ...

  4. CoreWCF 1.0.0 发布,微软正式支持WCF

    2022年4月28日,我们达到了一个重要的里程碑,并发布了CoreWCF的1.0.0版本.对Matt Connew (微软WCF团队成员)来说,这是5年前即 2017年1月开始的漫长旅程的结束.Mat ...

  5. 简单的TRPG骰子

    又到了新一年的带团季了,今年准备用电脑来存放各种资料,自然也是需要一个简单的骰子工具了,反正也不复杂,就自己写了个,放着做个备份吧 主要功能是计算x1dy1+/-x2dy2+/-.....+/-con ...

  6. 使用allatori混淆代码

    引言 为了保密需要,我们开发出来的程序在实际部署之前,需要先将jar包的代码进行混淆,让用户使用反编译也无法获得源码. allatori就是这样一个混淆java jar包代码的工具. 操作步骤 Ste ...

  7. Linux-进程工具

    1.进程树 pstree pstree 可以用来显示进程的父子关系,以树形结构显示 格式: pstree [OPTION] [ PID | USER ] 常用选项: -p 显示PID -T 不显示线程 ...

  8. Linux 实现静态路由实验

    环境: 四台主机: A主机:eth0 NAT模式 R1主机:eth0 NAT模式,eth1 仅主机模式 R2主机:eth0 桥接模式,eth1仅主机模式 B主机:eth0 桥接模式 手动修改IP地址 ...

  9. 分布式存储之GlusterFS

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 1.glusterfs概述 GlusterFS系统是一个可扩展的网络文件系统,相比其他分布式文件系统,GlusterFS具有 ...

  10. .NET混合开发解决方案6 检测是否已安装合适的WebView2运行时

    系列目录     [已更新最新开发文章,点击查看详细] 长青版WebView2运行时将作为Windows 11操作系统的一部分包含在内.但是在Windows 11之前(Win10.Win8.1.Win ...