[关闭]
@sensitive-cs 2016-10-19T16:08:55.000000Z 字数 894 阅读 714

O - Steps

分析:

给你一个m*n的坐标系,给出初始坐标以及许多向量,按顺序执行向量,每个向量可以执行多次,直到边界才执行下一个向量,问直到最后一个向量执行完为止,走了多少步,每步的定义是执行一次一个向量。

思路:

首先,若用for循环嵌套一个while,模拟执行过程的话,就T了,所以改进。即每次一步到位,直接到边界,这其中涉及到边界的判断以及执行的步数以x为准还是以y为准,具体结合代码理解。

代码:

  1. #include <stdio.h>
  2. long long dx[100009];
  3. long long dy[100009];
  4. long long int step(long long int n,long long int e,long long int f);
  5. int main()
  6. {
  7. long long n,m,k,x,y,i = 0;
  8. long long sum1,sum2,min = 0,cal = 0;
  9. scanf("%I64d%I64d",&n,&m);
  10. scanf("%I64d%I64d",&x,&y);
  11. scanf("%I64d",&k);
  12. for (i = 0;i < k;i++)
  13. scanf("%I64d%I64d",&dx[i],&dy[i]);
  14. for (i = 0;i < k;i++)
  15. {
  16. sum1 = step(n,x,dx[i]);
  17. sum2 = step(m,y,dy[i]);
  18. if (sum1 != -1 && sum2 != -1)
  19. {
  20. if (sum1 >= sum2)
  21. min = sum2;
  22. else
  23. min = sum1;
  24. }
  25. if (sum1 == -1)
  26. min = sum2;
  27. if (sum2 == -1)
  28. min = sum1;
  29. cal += min;
  30. x = x + min * dx[i];
  31. y = y + min * dy[i];
  32. }
  33. printf("%I64d\n",cal);
  34. return 0;
  35. }
  36. long long step(long long int n,long long int e,long long int f)
  37. {
  38. long long sum = 0;
  39. if (f > 0)
  40. {
  41. sum = (n - e) / (f);
  42. }
  43. else if (f < 0)
  44. {
  45. if (e % (-f) == 0)
  46. {
  47. sum = e / (-f) - 1;
  48. }
  49. else
  50. {
  51. sum = e / (-f);
  52. }
  53. }
  54. else
  55. {
  56. sum = -1;
  57. }
  58. return sum;
  59. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注