日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...

發布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目描述】 6046 數據包的調度機制 By OIer14wa隨著 Internet的迅猛發展,多媒體技術和電子商務應用日益廣泛,Internet上的服務質量
(QoS,Qualityof Service)問題已越來越受到重視。網絡中采用的數據包調度機制與網絡的服務質量 QoS 有著密切的關系。研究表明傳統的基于隊列的調度機制已不能滿足網絡服務質量QoS 的需求。服務質量 QoS 取決于數據包的延遲。每一個數據包都有一個延遲懲罰值。由于數據包承載的數據不同,不同數據包的延遲懲罰值也可能不同。此外,數據包的延遲也和它的發送順序有關。如果一個數據包被第K個發送,假設它的延遲懲罰值是D,則這個數據包的最終延遲是 (K - 1) * D。北京大學2012 級信息學院的同學在程序設計課堂上,設計了一種新的基于棧的數據包的調度算法。同學們通過棧的先進后出(Last in First out)的原理,改變數據包的發送順序,以減小數據包的延遲總值。給定N 個等待調度的數據包,起始這N 個數據包排成一個隊列等待發送。接著,這些數據包按序進棧,調度算法可以控制數據包的出棧順序。因此通過棧,可以將后面的數據包先于前面的數據包發送出去。請你實現一個調度算法使N 個數據包的延遲總值最小。
輸入標準的輸入包含若干組測試數據。輸入第一行是整數T(1 <= T <= 1000),表明有T組測試數據。緊接著有T組連續的測試。每一組測試數據的第1行是 N(N <= 100),表述數據包的個數。接著的 N 行,每一行是一個整數,第i 行表示數據包i的延遲懲罰值( <=50 )。輸出對于每組測試數據,輸出最小的延遲總值。
樣例輸入
1
5
5
4
3
2
2
樣例輸出
24
一、題意分析
枚舉所有的可能性,利用棧來控制數據包的發送順序,來得出最小的延遲懲罰值。
二、算法說明枚舉k是最后一個出棧,根據棧這個數據結構的特點,k如果是最后一個出棧,

k之前的一定在k之后的入棧前已經出棧了,k之后的元素之后才入棧,出棧。
根據棧的這一特點,我們可以把區間 [i--i+j-1]枚舉第k個元素最后出棧來劃分區間,劃分為前后兩個區間
先是區間[i..k-1],然后是區間[k+1..j],最后是k。
三、數據結構四、算法分析f[i][j]表示的是區間[i--i+j-1](j是延長的長度),最小延遲值

嘗試把一個區間作為整體來看,那么這個區間的最小懲罰值是

f[i][k-i]+a[k]*(len-1)+f[k+1][i+len-1-(k+1)+1]+(sum[i+len-1]-sum[k])*(k-i),

但是我們可以看出len是表示k(i--i+len-1枚舉序列中的元素)在當前序列中的位置,而不是整個n長序列的位置,那么*(len-1)會不會結果不對呢?而且f[i][k-i]在整體的序列中也不定是第一個,為什么不乘以他是第幾個出發的呢?

我們來看后面這個(sum[i+len-1]-sum[k])*(k-i),sum是前綴和,因為區間[k+1][i+len-1-(k+1)+1]是當前區間f[i][j]的子區間,而且他在這個區間中的是從第k-i個開始發數據包的,所以要乘以(k-i),這就可以向大區間考慮了,更新大區間的小區間表示的僅是他自身作為第一組的情況,再加上(sum[i+len-1]-sum[k])*(k-i),就可以完整的表示出這個小區間在大區間中究竟是第幾個位置了。
五、代碼與 調試
#include<stdio.h>
#include<string.h>
#define INF 1<<30
#define N 111
int a[N],f[N][N],n,t;
int sum[N];
void input()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
}
int min(int a,int b)
{
if(a<b)
return(a);
else
return(b);
}
void DP()
{
for(int len=2;len<=n;len++)
for(int i=1;i+len-1<=n;i++)
{
int tmp=INF;
for(int k=i;k<=i+len-1;k++)
{
tmp=min(tmp,f[i][k-i]+a[k]*(len-1)+f[k+1][i+len-1-(k+1)+1]+(sum[i+len-1]-sum[k])*(k-i));
}
f[i][len]=tmp;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
input();
DP();
printf("%dn",f[1][n]);
}
return 0;
}

總結

以上是生活随笔為你收集整理的一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。