接收器 - 发射器网络的最低​​成本

时间:2016-11-25 09:45:17

标签: algorithm

我们假设我们有n个设备,n偶数。每个设备既可以用作发射机(T),也可以用作接收机(R)。对于每个设备i,我们会获得2个数字,TiRiTi是设备作为发送器工作的成本,Ri成本作为接收器的成本Ti>=Ri。我们也知道in/2。{/ p>

我们的任务是准确选择n/2发射器和TTTRRR接收器,以达到最低成本。(最终答案仅为最低成本)< / p>

附加限制:Transmiters始终从左向右传输。 这意味着我们可以有序列TTRTRRTRTRTRRTTTRR等,但不能TTRR。在任何时候我们都不会遇到比发射器更多的接收器。

这项任务最适合哪种算法?

示例:我们有4台设备。 T1 = 9,R1 = 6,T2 = 6,R2 = 2,T3 = 8,R3 = 1,T4 = 5,R4 = 3

  • 可能的解决方案1:TRTR总费用:9 + 6 + 1 + 3 = 19
  • 可能的解决方案2:TTRR总费用:9 + 2 + 8 + 3 = 22

最佳解决方案:var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData); var filename = Path.Combine(path, ad.adid + ".mp4"); System.Uri url = new System.Uri(ad.video_url); const int BUFFER_SIZE = 16 * 1024; using (var outputFileStream = File.Create(filename)) { try { var req = WebRequest.Create(url); using (var response = req.GetResponse()) { using (var responseStream = response.GetResponseStream()) { var buffer = new byte[BUFFER_SIZE]; int bytesRead = -1; do { bytesRead = responseStream.Read(buffer, 0, BUFFER_SIZE); outputFileStream.Write(buffer, 0, bytesRead); } while (bytesRead > 0); catch (Exception e) { File.Delete(filename); StopSelf(); return; } } } } catch (Exception e) { File.Delete(filename); StopSelf(); return; } } ,费用为19。

所以最后的答案是19。

2 个答案:

答案 0 :(得分:1)

O(n^2)动态编程解决方案非常简单。

f(prefix_len, transmitters)成为可以获得的最优代价,即prefix_len元素已经处理完毕,前缀正确,发送者数量正好比transmitters多接收器的数量(也就是说,它在某种意义上说是平衡&#34;)

基本情况为f(0, 0) = 0(空前缀是免费的)。 转换如下f(prefix_len, transmitters) + T[i] -> f(prefix_len, transmitters + 1)(我们将当前元素设为发送器)。如果transmitters > 0,还有转换f(prefix_len, transmitters) + R[i] -> f(prefix_len + 1, transmitters - 1)(我们将其设为接收方)。

答案是f(n, 0)(也就是说,我们使用了所有元素,发射器的数量等于接收器的数量)。

答案 1 :(得分:0)

这是kraskevich大纲的评论性递归JavaScript实现:

var ts = [9,6,8,5],
    rs = [6,2,1,3],
    n = ts.length;

// returns cost from index i forward, with t more transmitters than receivers
function f(i,t){
  // last one must be a receiver
  if (i === n - 1) return rs[n-1];

  return Math.min(
    // avoid having more transmitters than we can receive
    t + 1 <= (n - i + 1) >> 1 ? ts[i] + f(i + 1,t + 1) : Infinity,

    // don't encounter more receivers than transmitters
    t > 0 ? rs[i] + f(i + 1,t - 1) : Infinity
  );
}

console.log(f(0,0)); // 19