10090

真蛋疼,WA了10+次,最后发现主要错在两个地方。。感觉用int超不了。。但实际上是超出int范围的。。
然后扩展欧几里德照着模版抄错了。。。而且错在一个极其隐蔽的地方。。导致错的话也能出sample。
思路是别人的。。。:

仔细观察题目可以发现如果每一个盒子都要装满的话,则必须满足以下条件:

am1+bm2=n

这个式子很像那个扩展欧几里得里面的那个,于是很容易联想到

ax+by=gcd(a,b)=g

根绝这个方程的特点,可以判断,如果n%gcd(a,b)!=0的话,则无解(参见《数论概论》)

于是联立这两个方程我们可以解出m1,m2

解出来m1=nx/g      m2=ny/g

那么通解则应该是m1=nx/g+bt/g    m2=ny/g-at/g(注意这里不能直接用ax+by=g的最小解来计算m1和m2,另外t是一个整数)

由题目的意思,可以判断m1和m2不可能为负数

于是m1>=0,m2>=0

这样我们可以解出t的范围:-nx/b<=t<=ny/a  这里的t必须是整数

我们假定:

t1=ceil(-nx/b)

t2=floor(ny/b)

如果t1>t2的话则t就没有一个可行的解,于是肯定也是无解的情况,所以输出不可能的两种情况就明确了

接下来,我们再来计算最终的价格V

V=va*m1+vb*m2

带入m1和m2的表达式可以得到

V=va*(xn/g+bt/g)+vb*(yn/g-at/g)

=((b*va-a*vb)/g)*t+(va*xn+vb*yn)/g

这个很明显是关于t的一个一次函数(出了t意外的数都是常数)

于是V(t)的单调性由(b*va-a*vb)来确定

所以当b*va-a*vb>=0的时候,t就要取最小才能让V(t)最小

反之,则t要去取最大才行

这里t的范围(定义域)已经是确定了的,所以t只有可能有两个取值

就是t1或者t2

剩下的问题就很明确了,得到t之后,再把t的值带入m1 m2的式子里面就可以计算出答案了

//============================================================================
// Name        : 10090.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;

long long a, b, c1, c2, n, t1, t2, g, t, x, y, ansa, ansb;

long long exGcd(long long a, long long b){
	if(b == 0){
		x = 1;
		y = 0;
		return a;
	}
	long long r = exGcd(b, a%b);
	long long t = x;
	x = y;
	y = t - a/b*y;
	return r;
}



int main()
{
	freopen("a.txt","r", stdin);
    while(scanf("%lld",&n)&&n)
    {
        scanf("%lld%lld%lld%lld",&c1,&a,&c2,&b);
        g = exGcd(a,b);
        t1 = ceil(-1.0*n*x/b);
        t2 = floor(1.0*n*y/a);
        if((t1>t2)||(n%g!=0))
        {
            printf("failed\n");
            continue;
        }
        if(b*c1-a*c2>0)
            t = t1;
        else
            t = t2;
        ansa = n*x/g + b*t/g;
        ansb = n*y/g - a*t/g;
        printf("%lld %lld\n",ansa,ansb);
    }
    return 0;
}
posted @ 2011-06-07 19:54  KOKO's  阅读(428)  评论(0编辑  收藏  举报