@sensitive-cs
2016-10-20T00:08:55.000000Z
字数 894
阅读 796
给你一个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;
else
min = 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;
}