sicily 1099 Packing Passengers

/**
**  题意:  求x,y 满足 x*pa+y*pb=n 同时使得 p = x*ca+y*cb的值最小,若有多种可能,则选择最大x值的组合
**  分析:  x*pa+y*pb=n 可以用 线性同余方程 求得各组解: X=x+(pb/q)*t, Y=y-(pa/q)*t 
**   t为整数,显然 X,Y>=0,所以 -x/(pb/q) <= t <= y/(pa/q)
**   欲使 x*ca+y*cb 最小, 注意到 其中 [(pb/q)*t]*ca + [-(pa/q)*t]*cb = (pb*ca-pa*cb)/q*t
**   当pb*ca-pa*cb<0,t应取最大值;
**   当pb*ca-pa*cb>0,t应取最小值;
**   当pb*ca-pa*cb=0,应选择较大的X值,显然 pb/q总是大于0的,所以t 选择最大值,X取得更大值
**   http://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95
***/

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 
 5 /**
 6 **    扩展欧几里德算法(辗转相除法), x*a+y*b=gcd(a,b)=q 
 7 **/
 8 long long x,y,q;
 9 void extend_eulid(long long a,long long b){
10     if(b==0){
11         x=1;
12         y=0;
13         q=a;    
14     }    
15     else{
16         extend_eulid(b,a%b);
17         //收集辗转相除法中产生的式子,倒回去,可以得到ax+by=gcd(a,b)的整数解
18         long long temp=x;
19         x = y;
20         y = temp-a/b*y;
21     }
22 }
23 int main()
24 {
25     int n,ca,pa,cb,pb,cnt=1;
26     long long upper,lower,t;
27     while(cin>>n&&n){
28         cin>>ca>>pa>>cb>>pb;    
29         extend_eulid(pa,pb);
30         if(n%q!=0)
31             cout<<"Data set "<<cnt++<<": cannot be flown"<<endl;
32         else{
33             //求特解
34             x = x*n/q;
35             y = y*n/q;    
36             upper = (long long)floor((double)y/(pa/q));     //返回小于或者等于指定表达式的最大整数头
37             lower = (long long)ceil((double)-x/(pb/q));     //返回大于或者等于指定表达式的最小整数头   
38             t = pb*ca-pa*cb<=0 ? upper : lower;    
39             cout<< "Data set "<<cnt++<<": "<<x+(pb/q)*t<<" aircraft A, "<<y-(pa/q)*t<<" aircraft B"<<endl;
40         }
41     }
42     return 0;
43 }

 

转载于:https://www.cnblogs.com/renaissance/p/3511347.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值