@Metralix
2016-10-17T16:56:58.000000Z
字数 986
阅读 878
这题首先要理解题意,就是像跳棋一样在棋盘上用一个姿势一直跳,直到不能再跳了,就换个姿势跳
我一开始想用 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;
}