TopCoder-SRM633-DIV1-250pt-PeriodicJumping-化连续为离散+溢出处理
2014-10-23 22:27
218 查看
http://community.topcoder.com/stat?c=problem_statement&pm=13234&rd=16076
首先需要想得到怎样的一组跳跃序列能够到达x。通过思考可以知道,当序列在沿到目标点的路线上走时,其所能走到的最长和最短的点覆盖目标点,就一定能够通过旋转这些铰链来使得末端跟目标点重合。
于是问题就转换为求最小的跳跃次数,使得其沿着到目标点的最短和最长分别在目标点的两侧。通过两个条件可以判断:
1)sum(l[0,j)) >=dist(x)
2) max(l[0,j))-(sum-max)<=x
满足这两个条件的第一个j,就是所求的j。
在这之上,还有三个陷阱需要考虑:
1)x的值可能为负的。所以需要先求绝对值。
2)x值可能很大而l[i]都很小,这样累加是不行的,首先得求得数组和然后除出最后一个循环能到达x点的。
3)l[i]的值很大可能求和会溢出,这时需要先判断是否l[i]和是大于x的以避免溢出。
首先需要想得到怎样的一组跳跃序列能够到达x。通过思考可以知道,当序列在沿到目标点的路线上走时,其所能走到的最长和最短的点覆盖目标点,就一定能够通过旋转这些铰链来使得末端跟目标点重合。
于是问题就转换为求最小的跳跃次数,使得其沿着到目标点的最短和最长分别在目标点的两侧。通过两个条件可以判断:
1)sum(l[0,j)) >=dist(x)
2) max(l[0,j))-(sum-max)<=x
满足这两个条件的第一个j,就是所求的j。
在这之上,还有三个陷阱需要考虑:
1)x的值可能为负的。所以需要先求绝对值。
2)x值可能很大而l[i]都很小,这样累加是不行的,首先得求得数组和然后除出最后一个循环能到达x点的。
3)l[i]的值很大可能求和会溢出,这时需要先判断是否l[i]和是大于x的以避免溢出。
vector<int> l; int minimalTime(int x, vector <int> jumpLengths) { l=jumpLengths; n=l.size(); x=abs(x); long long sum=0; long long maxv=0; int count=0; long long acc=0; for(int i=0;i<n;i++){ if (acc>x) break; else acc+=l[i]; } if (acc<x){ int cc=x/acc; sum=cc*acc; count=cc*n; } while(sum<x || maxv-(sum-maxv)>x){ long long cur=l[(count++)%n]; sum+=cur; maxv=max(maxv,cur); } return count; }
相关文章推荐
- TopCoder-SRM635-DIV1-250pt-SimilarRatingGraph-枚举+边界处理
- div和表格中文字溢出时折行显示的处理
- 小技巧处理div内容溢出
- div溢出中断处理代码
- Topcoder SRM 635 Div2 1000 (一种 O(n) 求一棵树中最长连续边 长度的方法)
- TopCoder-SRM631-DIV1-250pt-TaroJiroGrid-对解空间分析
- TopCoder-SRM635-DIV1-250pt-ShoppingSurveyDiv1-二分搜索
- 小技巧处理div内容溢出
- TopCoder-SRM637-DIV1-250pt-GreaterGame-集合+概率
- div 内容溢出 不换行处理
- TopCoder-SRM636-DIV1-250pt
- 小技巧处理div内容溢出
- 怎样处理一个溢出的磁盘
- div+css使用padding样式和!important标记实现Firefox和IE6处理带float样式的margin尺寸上的兼容
- div+css处理firefox与IE6的水平居中效果
- IE6下div会被ListBox、DropDownList遮住的处理办法
- 连续序列号中断后的处理两种处理方法
- [转载]IE6/IE7和Firefox对Div处理的差异
- JAVA项目异常处理(连续)
- div+css处理链接的:link,:visited,:hover,:active四种状态