ural 1430
题目:http://acm.timus.ru/problem.aspx?space=1&num=1430
题意很简单,第一感觉是枚举,但是看了一下数据范围,直接没有写,然后感觉 a * x + b * y = n - (某个数)这个方程有解,像是扩展欧几里德,写了之后没过样例。后来还是写了枚举,但是就是超时,网上找了一下,少了一个优化,但是优化的还没看懂,还是HG给讲的才看懂了
View Code
1 int main() 2 { 3 ll a,b,n; 4 int x,y; 5 int i; 6 while(cin>>a>>b>>n) 7 { 8 int flag = 0; 9 if(a < b) 10 { 11 flag = 1; swap(a,b); 12 } 13 int t = Min((n / a),b); // 如果有 n / a > b时,那么一定会枚举都某个i,i = (b + x),那么 a * (b + x) = a * b + a * x,那么b个a就可以用a个b来表示,所以这里有这个优化 14 int minx = -1; 15 for(i = 0; i <= t; i++) 16 { 17 if((n - a * i) % b < minx || minx == -1) 18 { 19 minx = (n - a * i) % b; 20 y = (n - a * i) / b; 21 x = i; 22 } 23 } 24 if(flag)cout<<y<<" "<<x<<endl; 25 else cout<<x<<" "<<y<<endl; 26 } 27 return 0; 28 }