[关闭]
@Metralix 2016-10-17T08:56:58.000000Z 字数 986 阅读 800

O


这题首先要理解题意,就是像跳棋一样在棋盘上用一个姿势一直跳,直到不能再跳了,就换个姿势跳
我一开始想用 for循环+while判断 解决这个问题,但是超时了,我不得不想其他的的方法
不循环的话,直接用除法可以降低时间复杂度。但是除法的话,要注意0,+,—的区别。所以每个x[i],y[i]我都分了三类,一共3*3=9类
所以代码又臭又长,辣眼睛,大佬们慎看

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. long long n,m,i;
  6. long long xc,yc;
  7. long long x[10000],y[10000];
  8. int k;
  9. long long sum=0;
  10. long long a,b;
  11. scanf("%I64d %I64d",&n,&m);
  12. scanf("%I64d %I64d",&xc,&yc);
  13. scanf("%d",&k);
  14. for(i=0;i<k;i++)
  15. {
  16. scanf("%I64d %I64d",&x[i],&y[i]);
  17. }
  18. for(i=0;i<k;i++)
  19. {
  20. if(x[i]>0&&y[i]>0)
  21. {
  22. a=(n-xc)/x[i];
  23. b=(m-yc)/y[i];
  24. }
  25. else if(x[i]<0&&y[i]<0)
  26. {
  27. a=(1-xc)/x[i];
  28. b=(1-yc)/y[i];
  29. }
  30. else if(x[i]>0&&y[i]<0)
  31. {
  32. a=(n-xc)/x[i];
  33. b=(1-yc)/y[i];
  34. }
  35. else if(x[i]<0&&y[i]>0)
  36. {
  37. a=(1-xc)/x[i];
  38. b=(m-yc)/y[i];
  39. }
  40. else if(x[i]==0&&y[i]>0)
  41. {
  42. a=999999999;
  43. b=(m-yc)/y[i];
  44. }
  45. else if(x[i]==0&&y[i]<0)
  46. {
  47. a=999999999;
  48. b=(1-yc)/y[i];
  49. }
  50. else if(x[i]<0&&y[i]==0)
  51. {
  52. a=(1-xc)/x[i];
  53. b=999999999;
  54. }
  55. else if(x[i]>0&&y[i]==0)
  56. {
  57. a=(n-xc)/x[i];
  58. b=999999999;
  59. }
  60. else if(x[i]==0&&y[i]==0)
  61. {
  62. a=0;
  63. b=0;
  64. }
  65. if(a>=b)
  66. {
  67. sum+=b;
  68. xc+=b*x[i];
  69. yc+=b*y[i];
  70. }
  71. else
  72. {
  73. sum+=a;
  74. xc+=a*x[i];
  75. yc+=a*y[i];
  76. }
  77. }
  78. printf("%I64d",sum);
  79. return 0;
  80. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注