代码改变世界

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 }