我们假设我们有n
个设备,n
偶数。每个设备既可以用作发射机(T
),也可以用作接收机(R
)。对于每个设备i
,我们会获得2个数字,Ti
和Ri
。 Ti
是设备作为发送器工作的成本,Ri
成本作为接收器的成本Ti>=Ri
。我们也知道i
每n/2
。{/ p>
我们的任务是准确选择n/2
发射器和TTTRRR
接收器,以达到最低成本。(最终答案仅为最低成本)< / p>
附加限制:Transmiters始终从左向右传输。
这意味着我们可以有序列TTRTRR
,TRTRTR
,RTTTRR
等,但不能TTRR
。在任何时候我们都不会遇到比发射器更多的接收器。
这项任务最适合哪种算法?
示例:我们有4台设备。 T1 = 9,R1 = 6,T2 = 6,R2 = 2,T3 = 8,R3 = 1,T4 = 5,R4 = 3
TRTR
总费用:9 + 6 + 1 + 3 = 19 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。
答案 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