您的位置:首页 > 其它

UVA, 10090 Marbles

2017-05-08 03:50 309 查看
题意:现在有n个玻璃珠玻璃珠要存,你要买盒子,商店一共两种盒子,第一种:价格为c1,能存n1个、第二种:价格为c2,能存n2个。让你求出使两种盒子装满且花销最小的方法,如果装不满就输出failed

思路:码了半天思路发现越写越不清楚。。。总之有公式:

m1的通解为m1=nx/g+n2*k/g

m2的通解为m2=ny/g-n1*k/g

于是乎因为m1和m2都大于0,所以可以得到:-n*x/n2<=k<=n*y/n1,如果第一种性价比最高(n1/c1>n2/c2),那么第一种越多越好,反之则第二种越多越好

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
__int64 gcd(__int64 a,__int64 b,__int64 &x,__int64 &y){
if (b==0){
x=1,y=0;
return a;
}
__int64 q=gcd(b,a%b,y,x);
y-=a/b*x;
return q;
}
int main()
{
__int64 n,n1,n2,p1,p2,x,y;
cin.sync_with_stdio(false);
while(cin>>n&&n)

cin>>p1>>n1>>p2>>n2;
__int64 g=gcd(n1,n2,x,y);
if(n%g!=0)
{
cout<<"failed\n";
continue;
}
__int64 m1,m2;
__int64 k1=ceil(-1*x*n*1.0/n2),k2=floor(y*n*1.0/n1);
x*=n/g;
y*=n/g;
if(k1>k2)
{
cout<<"failed\n";
continue;
}
if(p1*n2<p2*n1)
{
m1=x+n2*k2/g;
m2=y-n1*k2/g;
}
else
{
m1=x+n2*k1/g;
m2=y-n1*k1/g;
}
cout<<m1<<" "<<m2<<"\n";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: