TopCoder-SRM633-DIV1-250pt-PeriodicJumping-化连续为离散+溢出处理

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

 

posted @ 2014-10-23 22:27  zombies  阅读(226)  评论(0编辑  收藏  举报