1099. Packing Passengers
2011-04-21 15:18 Min·zc 阅读(412) 评论(0) 编辑 收藏 举报
1 /*
2 题目大意是要求用两个飞机正好将所有的乘客全部载下,并且要求所要花费的费用最少
3 根据第一个条件,这道题就转化成了求解不定方程的问题
4 A机型的载客量*A机型的数量+B机型的载客量*B机型的数量=总乘客量-----(1)
5 使用扩展欧几里得算法可以求出一组基本解x,y使得一下的算式成立
6 A机型的载客量*X+B机型的载客量*Y=gcd(A机型的载客量,B机型的载客量)
7 X*=(总乘客量/gcd)
8 Y*=(总乘客量/gcd)
9 就求出了一组满足(1)的一组解
10 不定方程(1)的其他解可以通过(2),(3)求出
11 X=X+B的载客量/gcd(A的载客量,B的载客量)*t-------------(2)
12 Y=Y-A的载客量/gcd(A的载客量,B的载客量)*t-------------(3)
13 因为题目还有条件二,也就是需要让使用的费用最小
14 为了满足这个条件,就需要尽可能多的选择那些性价比高的机型,就是使得(2)或者(3)尽可能接近0
15 因为X,Y不能为负所以需要对求解出来的t进行取整修改
16
17 */
18 #include <iostream>
19 #include <math.h>
20 using namespace std;
21 long long exgcd(long long a,long long b,long long &x,long long &y)
22 {
23 if(b==0)
24 {
25 x=1;
26 y=0;
27 return a;
28 }
29 long long r=exgcd(b,a%b,x,y);
30 long long t=x;
31 x=y;
32 y=t-a/b*y;
33 return r;
34 }
35 int main()
36 {
37 long long n,coa,cob,caa,cab;
38 cin>>n;
39 int t=1;
40 while(n!=0)
41 {
42 cin>>coa>>caa>>cob>>cab;
43 long long x,y;
44 long long r=exgcd(caa,cab,x,y);
45 if(n%r!=0)
46 cout<<"Data set "<<t<<": cannot be flown"<<endl;
47 else
48 {
49 x*=(n/r);
50 y*=(n/r);
51
52 int dela=ceil((double)(-x)*r/cab);//如果b性价比高那么就将a机型飞机的数量减少,使得其尽可能的接近0
53 int delb=floor((double)(y)*r/caa);//如果a性价比高那么就将b机型飞机的数量减少,使得其尽可能的接近0
54
55 int tem=coa*cab<=cob*caa?delb:dela;//选出性价比高的机型
56 x+=cab/r*tem;
57 y-=caa/r*tem;
58 cout<<"Data set "<<t<<": "<<x<<" aircraft A, "<<y<<" aircraft B"<<endl;
59 }
60 cin>>n;
61 t++;
62 }
63 }
2 题目大意是要求用两个飞机正好将所有的乘客全部载下,并且要求所要花费的费用最少
3 根据第一个条件,这道题就转化成了求解不定方程的问题
4 A机型的载客量*A机型的数量+B机型的载客量*B机型的数量=总乘客量-----(1)
5 使用扩展欧几里得算法可以求出一组基本解x,y使得一下的算式成立
6 A机型的载客量*X+B机型的载客量*Y=gcd(A机型的载客量,B机型的载客量)
7 X*=(总乘客量/gcd)
8 Y*=(总乘客量/gcd)
9 就求出了一组满足(1)的一组解
10 不定方程(1)的其他解可以通过(2),(3)求出
11 X=X+B的载客量/gcd(A的载客量,B的载客量)*t-------------(2)
12 Y=Y-A的载客量/gcd(A的载客量,B的载客量)*t-------------(3)
13 因为题目还有条件二,也就是需要让使用的费用最小
14 为了满足这个条件,就需要尽可能多的选择那些性价比高的机型,就是使得(2)或者(3)尽可能接近0
15 因为X,Y不能为负所以需要对求解出来的t进行取整修改
16
17 */
18 #include <iostream>
19 #include <math.h>
20 using namespace std;
21 long long exgcd(long long a,long long b,long long &x,long long &y)
22 {
23 if(b==0)
24 {
25 x=1;
26 y=0;
27 return a;
28 }
29 long long r=exgcd(b,a%b,x,y);
30 long long t=x;
31 x=y;
32 y=t-a/b*y;
33 return r;
34 }
35 int main()
36 {
37 long long n,coa,cob,caa,cab;
38 cin>>n;
39 int t=1;
40 while(n!=0)
41 {
42 cin>>coa>>caa>>cob>>cab;
43 long long x,y;
44 long long r=exgcd(caa,cab,x,y);
45 if(n%r!=0)
46 cout<<"Data set "<<t<<": cannot be flown"<<endl;
47 else
48 {
49 x*=(n/r);
50 y*=(n/r);
51
52 int dela=ceil((double)(-x)*r/cab);//如果b性价比高那么就将a机型飞机的数量减少,使得其尽可能的接近0
53 int delb=floor((double)(y)*r/caa);//如果a性价比高那么就将b机型飞机的数量减少,使得其尽可能的接近0
54
55 int tem=coa*cab<=cob*caa?delb:dela;//选出性价比高的机型
56 x+=cab/r*tem;
57 y-=caa/r*tem;
58 cout<<"Data set "<<t<<": "<<x<<" aircraft A, "<<y<<" aircraft B"<<endl;
59 }
60 cin>>n;
61 t++;
62 }
63 }