@sensitive-cs
        
        2016-10-19T16:08:55.000000Z
        字数 894
        阅读 958
    给你一个m*n的坐标系,给出初始坐标以及许多向量,按顺序执行向量,每个向量可以执行多次,直到边界才执行下一个向量,问直到最后一个向量执行完为止,走了多少步,每步的定义是执行一次一个向量。
首先,若用for循环嵌套一个while,模拟执行过程的话,就T了,所以改进。即每次一步到位,直接到边界,这其中涉及到边界的判断以及执行的步数以x为准还是以y为准,具体结合代码理解。
#include <stdio.h>long long dx[100009];long long dy[100009];long long int step(long long int n,long long int e,long long int f);int main(){long long n,m,k,x,y,i = 0;long long sum1,sum2,min = 0,cal = 0;scanf("%I64d%I64d",&n,&m);scanf("%I64d%I64d",&x,&y);scanf("%I64d",&k);for (i = 0;i < k;i++)scanf("%I64d%I64d",&dx[i],&dy[i]);for (i = 0;i < k;i++){sum1 = step(n,x,dx[i]);sum2 = step(m,y,dy[i]);if (sum1 != -1 && sum2 != -1){if (sum1 >= sum2)min = sum2;elsemin = sum1;}if (sum1 == -1)min = sum2;if (sum2 == -1)min = sum1;cal += min;x = x + min * dx[i];y = y + min * dy[i];}printf("%I64d\n",cal);return 0;}long long step(long long int n,long long int e,long long int f){long long sum = 0;if (f > 0){sum = (n - e) / (f);}else if (f < 0){if (e % (-f) == 0){sum = e / (-f) - 1;}else{sum = e / (-f);}}else{sum = -1;}return sum;}