您的位置:首页 > 运维架构

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的以避免溢出。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: