poj 2142 The Balance

  解题思路大致就是解一个同余式,ax=c(mod b),解出来是x0,y0

  要找到题目所谓的最小解,即x0=x0+(b/d)*n;y0=y0-(a/d)*n使|x0|+|y0|最小,如果让a>b这样的话,|x0|+|y0|就是先减后增的y0-(a/d)*n=0解出来n附近的n值可得到要求的值 。

 

 

#include<stdio.h>
#include<cstdlib>
#include<iostream>
#include<math.h>
using namespace std;

#define ll long long

ll abss(ll a)
{
    if(a<0)
        return -a;
    return a;
}

ll exgcd(ll m,ll& x,ll n,ll& y)
{
    ll x1,y1,x0,y0;
    x0=1;y0=0;
    x1=0;y1=1;
    ll r=(m%n+n)%n;
    ll q=(m-r)/n;
    x=0;y=1;
    while(r)
    {
        x=x0-q*x1;y=y0-q*y1;
        x0=x1;y0=y1;
        x1=x;y1=y;
        m=n;n=r;r=m%n;
        q=(m-r)/n;
    }
    return n;
}

int main()
{
 //   freopen("data.txt","r",stdin);
    ll a,b,c,d,x0,y0;
    while(cin>>a>>b>>c&&(a+b+c))
    {
        
        int tt=0;
        if(a<b)
        {
            tt=1;
            ll e;
            e=a;
            a=b;
            b=e;
        }
        d=exgcd(a,x0,b,y0);
        x0=x0*(c/d);
        y0=y0*(c/d);
        ll t=(y0)*d/a;
        ll mini=9999999999,minm;
        ll ax,by;
        for(ll i=t-10;i<=t+10;i++)
        {
            if(abss(x0+b/d*i)+abss(y0-a/d*i)<mini)
            {
                ax=abss(x0+b/d*i);
                by=abss(y0-a/d*i);
                mini=ax+by;
                minm=a*abss(x0+b/d*i)+b*abss(y0-a/d*i);
            }
            else if(abss(x0+b/d*i)+abss(y0-a/d*i)==mini)
            {
                if(a*abss(x0+b/d*i)+b*abss(y0-a/d*i)<minm)
                {
                    ax=abss(x0+b/d*i);
                    by=abss(y0-a/d*i);
                    mini=ax+by;
                    minm=a*abss(x0+b/d*i)+b*abss(y0-a/d*i);
                }
            }
        }
        if(!tt)
        cout<<ax<<' '<<by<<endl;
        else cout<<by<<' '<<ax<<endl;
    }
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值