这道题看上去有点欧几里得算法的意思在里面,实际上不是。我仅仅是在判断有没有解的时候用了一次求最大公约数的算法,接下来就是模拟,分别模拟从a往b倒和从b往a倒得两种情况,很容易就Accepted了。
#include <cstdio>
#include <climits>
using namespace std;
int ntest,a,b,c,d;
int min(int a,int b) {
return a<b?a:b;
}
int gcd(int a,int b) {
return b==0?a:gcd(b,a%b);
}
int check(int a,int b) {
int ret = 0,ca = 0,cb = 0;
for (;;) {
if (ca==c || cb==c) return ret;
if (cb==b) cb = 0;
else if (ca==0) ca = a;
else {
int dt = min(b-cb,ca);
ca -= dt; cb += dt;
}
ret++;
}
}
int main() {
scanf("%d",&ntest);
while (ntest--) {
scanf("%d%d%d",&a,&b,&c);
d = gcd(a,b);
if (c%d!=0 || c>a && c>b) printf("-1\n");
else {
int ans = check(a,b);
ans = min(ans,check(b,a));
printf("%d\n",ans);
}
}
return 0;
}
Your program in C++ from 2010-04-09 07:16:22 ran for 0.01 seconds and used 2536 KB of memory.
的基础上加权分块,不然会出现TLE的问题。
