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;
}
思路:码了半天思路发现越写越不清楚。。。总之有公式:
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;
}
相关文章推荐
- uva 10090 - Marbles 扩展欧几里得
- UVa Problem 10090 Marbles (弹珠)
- UVa 10090 - Marbles
- Uva 10090 Marbles 扩展欧几里得 费用最小
- UVa Problem Solution: 10090 - Marbles
- uva 10090 marbles
- UVA 10090 - Marbles 拓展欧几里得
- UVA10090 Marbles【扩展欧几里得算法】
- uva 10090 - Marbles(欧几里得+通解)
- UVA 10090 Marbles(扩展欧几里得)
- UVA 10090 Marbles(扩展欧几里得)
- uva 10090 Marbles
- UVA 10090 Marbles 扩展欧几里得
- SCU - 1269 UVA - 10090 Marbles (拓展欧几里得算法的解空间结构)
- UVA 10090 - Marbles (数论)
- UVA10090 数论基础 exgcd
- 拓展欧几里得详解 及其题目 POJ 1061 2115 2142 UVA 10673 10090
- UVA 10090 扩展欧几里得算法
- 数学专项number_theory:UVa 10090
- UVA 11125 Arrange Some Marbles