@Metralix
2016-10-17T08:56:58.000000Z
字数 986
阅读 1032
这题首先要理解题意,就是像跳棋一样在棋盘上用一个姿势一直跳,直到不能再跳了,就换个姿势跳
我一开始想用 for循环+while判断 解决这个问题,但是超时了,我不得不想其他的的方法
不循环的话,直接用除法可以降低时间复杂度。但是除法的话,要注意0,+,—的区别。所以每个x[i],y[i]我都分了三类,一共3*3=9类
所以代码又臭又长,辣眼睛,大佬们慎看
#include <stdio.h>#include <stdlib.h>int main(){long long n,m,i;long long xc,yc;long long x[10000],y[10000];int k;long long sum=0;long long a,b;scanf("%I64d %I64d",&n,&m);scanf("%I64d %I64d",&xc,&yc);scanf("%d",&k);for(i=0;i<k;i++){scanf("%I64d %I64d",&x[i],&y[i]);}for(i=0;i<k;i++){if(x[i]>0&&y[i]>0){a=(n-xc)/x[i];b=(m-yc)/y[i];}else if(x[i]<0&&y[i]<0){a=(1-xc)/x[i];b=(1-yc)/y[i];}else if(x[i]>0&&y[i]<0){a=(n-xc)/x[i];b=(1-yc)/y[i];}else if(x[i]<0&&y[i]>0){a=(1-xc)/x[i];b=(m-yc)/y[i];}else if(x[i]==0&&y[i]>0){a=999999999;b=(m-yc)/y[i];}else if(x[i]==0&&y[i]<0){a=999999999;b=(1-yc)/y[i];}else if(x[i]<0&&y[i]==0){a=(1-xc)/x[i];b=999999999;}else if(x[i]>0&&y[i]==0){a=(n-xc)/x[i];b=999999999;}else if(x[i]==0&&y[i]==0){a=0;b=0;}if(a>=b){sum+=b;xc+=b*x[i];yc+=b*y[i];}else{sum+=a;xc+=a*x[i];yc+=a*y[i];}}printf("%I64d",sum);return 0;}