uva 10090 Marbles

Problem
F

Marbles

Input: standard input

Output: standard output

I have some (say, n) marbles (small glass balls) and I am going
to buy some boxes to store them. The boxes are of two types:

Type 1: each box costs c1 Taka
and can hold exactly n1 marbles

Type 2: each box costs c2 Taka
and can hold exactly n2 marbles

I want each of the used boxes to be filled to its capacity and also to
minimize the total cost of buying them. Since I find it difficult for me to
figure out how to distribute my marbles among the boxes, I seek your help. I
want your program to be efficient also.

Input

The input file may contain multiple test cases. Each test case begins with a
line containing the integer n (1 <= n <= 2,000,000,000). The second line
contains c1 and n1, and
the third line
contains c2 and n2.
Here, c1c2n1 and nare
all positive integers having values smaller than 2,000,000,000.

A test case containing a zero for n in the first line
terminates the input.

Output

For each test case in the input print a line containing the minimum cost
solution (two nonnegative
integers m1 and m2,
where mi = number ofType
i
 boxes required) if one exists, print "failed" otherwise.

If a solution exists, you may assume that it is unique.

 

Sample Input

43
1 3
2
4
40
5 9
5 12
0

 

Sample Output

13
1
failed

___________________________________________________________________

Rezaul Alam
Chowdhury

“The easiest way to count cows in a grazing field is to count how many hooves
are there and then divide it by four!”

题意很简单:ax+by=c; 求c1x+c2y的最小值。

首先要说一下两个函数的区别。

    floor(1.00001) = 1; floor(1.99999) = 1;

    ceil(1.00001) = 2; ceil(1.99999) =2;

    其实是对函数的取整的问题。

思路:当然,首先要判断是否有解,这个过程。。  g=gcd(a,b);

由于 x = x*c/g + k*(b/g);

y = y*c/g  - k*(a/g);  x>=0
&& y>=0 ,因为不能能买负数个东西。

==> x*c/b <=k <=c*y/a;

   ok,这个就是k的取值范围。

这里就要用到一个问题,k是整数,如果取值才是合理的呢?

ceil(x*c/b)<=k<=floor(c*y/a);

这里不解释,1.24<=k<=4.25  ==> 2<=k<=4;?? enen .

现在k的范围求出来了,那么现在就是求对应的x,和y的值了。

有式子  c1x+c2y = c1*x+c2*(c-a*x)/b = c1*x - c2*a/b*x + c2*a/b;

就是化简成只有x的情况进行讨论。

我们只需要看c1*x - c2*a/b*x这一部分, x*(  c1-c2*a/b  )

当c1-c2*a/b<0的时候,x应该越到越好,这就可以根据已经求出的k来做了。

当c1-c2*a/b>0的时候,x应该越小越好。同理。

当c1-c2*a/b=0的时候,当然,就随意在前面一种情况里都是一样的。

code:


 1 #include<iostream>
2 #include<stdio.h>
3 #include<cstring>
4 #include<cstdlib>
5 #include<cmath>
6 using namespace std;
7 typedef long long LL;
8
9 LL Ex_GCD(LL a,LL b,LL &x,LL& y)
10 {
11 if(b==0)
12 {
13 x=1;
14 y=0;
15 return a;
16 }
17 LL g=Ex_GCD(b,a%b,x,y);
18 LL hxl=x-(a/b)*y;
19 x=y;
20 y=hxl;
21 return g;
22 }
23 int main()
24 {
25 LL n,c1,n1,c2,n2;
26 LL c,a,b,x,y,g;
27 while(scanf("%lld",&n)>0)
28 {
29 if(n==0)break;
30 scanf("%lld%lld",&c1,&n1);
31 scanf("%lld%lld",&c2,&n2);
32 a=n1;
33 b=n2;
34 c=n;
35 g=Ex_GCD(a,b,x,y);
36 if(c%g!=0)
37 {
38 printf("failed\n");
39 continue;
40 }
41 LL lowx =ceil ( -1.0*x*c/(double)b);
42 LL upx = floor( c*y*1.0/(double)a );
43 if(upx<lowx)
44 {
45 printf("failed\n");
46 continue;
47 }
48 if(c1*b<=a*c2)/** x越大越好,就取上限值 */
49 {
50 x=x*(c/g)+upx*(b/g);
51 y=y*(c/g)-upx*(a/g);
52 }
53 else
54 {
55 x=x*(c/g)+lowx*(b/g);
56 y=y*(c/g)-lowx*(a/g);
57 }
58 printf("%lld %lld\n",x,y);
59 }
60 return 0;
61 }

时间: 2024-09-28 22:18:37

uva 10090 Marbles的相关文章

uva 10090 - Marbles(欧几里得+通解)

题目链接:uva 10090 - Marbles 题目大意:给出n,表示有n个珠子,现在要用若干个盒子来装.有两种盒子,一种价钱c1,可以装t1个珠子,另一种价钱c2,可以装t2个珠子.要求所卖的盒子刚好装n个珠子,并且价钱最小的方案. 解题思路:用拓展欧几里得算法求出xt1+yt2=n的一对解x′和y′,这样就有通解: x=x′ngcd(t1,t2)+t2gcd(t1,t2)k y=y′ngcd(t1,t2)?t1gcd(t1,t2)k 然后根据性价比选择一种盒子的个数尽量多. #includ

UVA 10090 - Marbles (数论)

UVA 10090 - Marbles 题目链接 题意:有两种盒子,一种代价c1,能装n1个珠子,一种代价c2,能装n2个珠子,问如何正好装n个珠子,并且使得代价最少. 思路:利用扩展欧几里得算法求出n1?x+n2?y=n的一个解(x′,y′) 就可以知道x,y的通解分别为 x=x′?n/gcd(n1,n2)+n2/gcd(n1,n2)?t y=y′?n/gac(n1,n2)?n1/gcd(n1,n2)?t 由于x > 0 && y > 0,就可以求出t的范围. 那么t越小x越

UVA 10090 - Marbles 拓展欧几里得

I have some (say, n) marbles (small glass balls) and I am going to buy some boxes to store them. Theboxes are of two types:T ype 1: each box costs c1 Taka and can hold exactly n1 marblesT ype 2: each box costs c2 Taka and can hold exactly n2 marblesI

UVA 10090 Marbles(扩展欧几里得)

Marbles Input: standard input Output: standard output I have some (say, n) marbles (small glass balls) and I am going to buy some boxes to store them. The boxes are of two types: Type 1: each box costs c1 Taka and can hold exactly n1 marbles Type 2:

拓展欧几里得详解 及其题目 POJ 1061 2115 2142 UVA 10673 10090

最近做了一些拓展欧几里得的题目呢,嘛,从一开始的不会到现在有点感觉,总之把我的经验拿出来和大家分享一下吧. 普通的欧几里得是用于解决求两个数a,b的gcd的,但是我们知道,gcd是线性组合 { ax+by | x,y∈Z }里的最小正元素(什么?不知道怎么来的?好吧...算法导论里数论算法那一章有证明),假若我们能够把这个x和y找出来,那么可以用来解决很多问题. (以下的gcd和lcm均指(gcd(a,b)和lcm(a,b)) 首先,假设ax+by=gcd这一个方程有一个特解x*,y*.那么显然

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

UVA 11125 Arrange Some Marbles

dp[i][j][m][n][s]表示最初选择j个i号颜色大理石.当前选择n个m号颜色大理石.剩余大理石状态(8进制数状压表示)最开始没看出状压..sad #include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue>