2.圆圈舞蹈( circle)

【问题描述】

熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。

奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛

到底隔了多远。

【输入】

第一行一个整数N,表示有N只奶牛。(2≤N≤100000)

接下来2~N+1行,第I行有一个数,表示第I-1头奶牛顺时针到第I头奶牛的距离。(1≤距离≤maxlongint,距离和≤maxlongint)

第N+l行的数表示第N头奶牛顺时针到第1头奶牛的距离。

【输出】

一行,表示最大距离。

【样例】

Circle.in

5

1

2

3

4

5

Circle.out

7

【样例解析】

Circle.out所有奶牛I到J之间的距离和到达方式(顺为顺时针,逆为逆时针)如下:

I\J

1

2

3

4

5

1

O

1 (顺)

3(顺)

6(顺)

5(逆)

2

1(逆)

O

2(顺)

5(顺)

6(逆)

3

3(逆)

2(逆)

0

3(顺)

7(顺)

4

6(逆)

5(逆)

3(逆)

0

4(顺)

5

5(顺)

6(顺)

7(逆)

4(逆)

0

所以,最远的两头奶牛为3到5,距离是7。

 分析样例(手写样例)时我们发现,最远距离总是接近圆圈周长的一半,对此我们可以证明

因为奶牛A到B的距离为A顺时针走(dis)和逆时针走(ddis),到达B的较短路程,逆时针走(ddis)等于圆圈周长(sum)减去顺时针走的路程(dis),所以最远距离即求  min(sum-dis,dis) 的最大值

什么时候最大?

显然,当dis最接近sum/2时。

因此我们只需要求得每个点的最远距离即可解答=v=

下面是寻找每个点的最远距离的过程

(蓝字表示dis)

首先是1号点(o゜▽゜)o☆

当到达4号点时,dis=6;当到达5号点时,dis=10;

因此又引出一个细节:因为我们寻找的总是折中的点,所以要比较它和它相邻的点分别到起点的距离;

距离1号点最远的是4号点

当寻找起点为2号点的最远距离时,简单的方法是将起点顺时针移动,如果距离未达到sum/2,就将终点也顺时针移动

寻找完后,dis=6-1+4=9,距离是6,与1号点的最远距离比较,最远距离不变依然为6

重复上述步骤,最终最远距离为起点是3号点,终点是5号点的距离,即7

(っ*´Д`)っ下面放出代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<ctime>
  5. #include<algorithm>
  6. using namespace std;
  7. int n;
  8. long long sum;
  9. long long l[];
  10. long long dis;
  11. void work()
  12. {
  13. int u=;
  14. int v=;
  15. dis=;
  16. long long ans=;
  17. int j;
  18. for(int i=;i<=n;i++)//寻找距离一号点最远的点
  19. {
  20. dis+=l[i-];//***
  21. if(dis>sum/)
  22. {
  23. j=i;//记录这个点
  24. break;
  25. }
  26. }
  27. ans=max(ans,min(sum-dis,dis));//因为我们寻找的是折中的点,所以需要比较两次,即它和它相邻的点;
  28. ans=max(ans,min(dis-l[j-],sum-dis+l[j-]));
  29. for(int i=;i<=n;i++)
  30. {
  31. dis=dis-l[i-];//寻找第i个点的最远距离,将起点从上一个点顺时针移动
  32. while(dis<sum/)
  33. {
  34. dis+=l[j+];
  35. j++;//终点也顺时针移动
  36. }
  37. ans=max(ans,min(sum-dis,dis));//与上面同理
  38. ans=max(ans,min(sum-dis+l[j-],dis-l[j-]));
  39. }
  40. printf("%lld ",ans);
  41. }
  42. void read()
  43. {
  44. scanf("%d",&n);
  45. for(int i=;i<=n;i++)
  46. {
  47. scanf("%lld",&l[i]);
  48. sum+=l[i];//记录圆圈周长
  49. }
  50. }
  51. int main()
  52. {
  53. freopen("circle.in","r",stdin);
  54. freopen("circle.out","w",stdout);
  55. //clock_t start=clock();
  56. read();
  57. work();
  58. //clock_t end=clock();
  59. //printf("%d %d",start,end);
  60. return ;
  61. }

NOIP2012模拟试题【圆圈舞蹈( circle)的更多相关文章

  1. NOIP2012模拟试题【奶牛晒衣服】

    1.奶牛晒衣服(dry) [问题描述] 在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝.熊大妈决定给每个宝宝都穿上可爱的婴儿装.于是,为牛宝宝洗晒衣服就成了很不爽的事情. 圣人王担负起了这个重任 ...

  2. NOIP2012模拟试题 121105【奶牛排队(tahort)

    3.奶牛排队(tahort) [ 问题描述] 奶牛在熊大妈的带领下排成了一条直队. 显然,不同的奶牛身高不一定相同…… 现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的 ...

  3. 冲刺NOIP2015提高组复赛模拟试题(五)2.道路修建

    2.道路修建 描述 Description liouzhou_101最悲痛的回忆就是NOI2011的道路修建,当时开了系统堆栈,结果无限RE… 出于某种报复心理,就把那题神奇了一下: 在 Z星球上有N ...

  4. 模拟试题C

    模拟试题C 一.单项选择题(2′*14 =28′) 1.双线性法向插值法(Phong Shading)的优点是( ) A)法向计算精确 B)高光域准确 C)对光源和视点没有限制 D)速度较快 2.用编 ...

  5. 模拟试题B

    模拟试题B 一.单项选择题(2′*8 =16′) 1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( ) A)512KB B)1MB C)2MB D)3MB 2.在多 ...

  6. 模拟试题A

    模拟试题A 一.单项选择题(2′*12=24′) 1.下面各种坐标变换中,会产生变换前后维度的改变的是( ) A)建模变换 B)观察变换 C)投影变换 D)视口变换 2.下列描述深度缓冲消隐算法的特点 ...

  7. CCF 模拟试题——出现次数最多的数 官方答案解析及自己写的正确答案

    前几天知道的CCF计算机职业资格认证考试,觉得好像比软考含金量高一些,就去了解了一下,做了模拟试题中的 “出现次数最多的数” 这道题,我的算法和官方答案算法不同,个人觉得觉得官方的好一点,没那么繁琐, ...

  8. 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号

    [NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...

  9. 9.29noip模拟试题

    环上的游戏(cycle) 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这 ...

随机推荐

  1. Linux系统安装VM-Tools

    安装 vmware-tools的安装包有两个,一个是rpm包,一个是tar包,下面分别是用了这两种方法安装: 一.rpm包安装 1.在启动LINUX 虚拟机之后,在WMWare 的菜单栏中点击&quo ...

  2. Sequence one(hdu2610dfs+去重)

    题目:有一个数列N,和一个数字k,输出该数列的前k个子序列,如果k大于N的所有子序列,输出所有符合要求的序列,序列要求不能是递减序列 比如: 3 5 1 3 2 的前五个序列为 1 3 2 1 3 1 ...

  3. html加载js那些事

    浏览器通过内置的JavaScript引擎,读取网页中的代码,对其处理后运行. JavaScript代码嵌入网页的方法 在网页中嵌入JavaScript代码有多种方法. 直接添加代码块 通过script ...

  4. eclipse 各种版本spring插件安装

    一.安装之前先得知道怎么下载吧: 一般网上找到的资料是到这里就GG了的 --> http://spring.io/tools/sts/all 很明显这点版本是不够我们需要的,假如我们的eclip ...

  5. Java与C++相异的地方

    继承标识:Java使用extends/implement,C++使用: super:调用父类的某些东西 instanceof:RTTI机制(A is instanceif B) final:类似于C+ ...

  6. Visual C++ 64bit应用程序项目设置

    Visual Studio 2005 This topic describes how to set up C++ applications to target 64-bit platforms us ...

  7. mongoengine连接错误:“False is not a read preference”解决方法

    问题出现: Mongoengine是一个可以操作MongoDB数据库的对象-文档映射器(Object-Document Mapper).出于工作需要,最近在使用MongoDB+Django实现一个数据 ...

  8. 让QT对话框显示中文

    http://blog.sina.com.cn/s/blog_8254427901011fxv.html (1)从QT安装目录下面将文件“qt_zh_CN.qm”复制一份到你的项目目录下. 例如,我是 ...

  9. Android Studio优化之启用Shift+Ctrl+O导入所有的包

    在使用Eclipse开发Android应用时,开发者往往会使用Shift+Ctrl+O快捷键来快速导入所有的包,和移除已经导入但还未使用的包.但这个快捷键在Android Studio没人是给有开启的 ...

  10. SSH25个命令 + 深入SSH端口转发细节

    OpenSSH是SSH连接工具的免费版本.telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃 ...