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 }
posted @ 2012-10-25 20:35  AC_Girl  阅读(159)  评论(0编辑  收藏  举报