題目 G 尋找dijun

2021-09-22 12:17:13 字數 1504 閱讀 4098

題目描述

小明在玩乙個戰略遊戲。他現在的任務是找到敵方的軍隊在什麼地方。他已經知道敵方的軍隊可能在的幾個區域和每個區域敵方的軍隊可能存在的概率,且敵方的軍隊只可能存在於這些區域中的某乙個區域當中。他擁有乙個科技:可以同時掃瞄若干個區域並花費區域個數的金錢。但遊戲有一定的限制,小明必須將這些區域分成 k 組,且只能對 k 組的區域依次進行一次掃瞄。現在小明想知道怎麼樣的劃分區域的策略可以使得找到敵軍時花費的金錢數的數學期望最小。

輸入

輸入第一行是乙個正整數 t(t<=10),表示資料組數。

接下來對於每組資料,第一行給出兩個正整數 n(1<=n<=100)和k(1<=k<=n<=100),分別表示區域個數和劃分組數。第二行給出 n 個不超過 100 的正整數,依次代表每個區域的概率(單位:%),其中保證所有區域的概率相加等於 100%。

輸出

對於每組資料,輸出乙個實數,表示花費金錢數的數學期望的最小值,保留 3 位小數。

樣例輸入

2

5 230 5 10 30 25

5 530 5 10 30 25

樣例輸出

3.200

2.300

解題思路

為了讓總期望值最小,應該讓概率大的區域盡量放在前面去訪問。所以先把所有概率從大到小排序一遍。然後分組時,就可以取連續的一段分為一組了。

dp [ i ][ j ]表示: 前i個,分成j組的最小期望則有動態方程:

dp[ i ][ j ] = min

參考**

#include #include #include #define max_len 105

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

/***排序 從大到小

*/bool cmp(double a,double b)

int main ()

sort(p+1, p+n+1, cmp);

sum[0] = 0;

for (int i = 1; i <= n; i++)

for (int i = 0; i <= n; i++)

}dp[0][0] = 0;

for (int i = 1; i <= n; i++)

}} printf("%.3f\n", dp[n][w]);

}return 0;

}

題目1034 尋找大富翁

題目1034 尋找大富翁 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 7115 解決 2792 題目描述 浙江桐鄉烏鎮共有n個人,請找出該鎮上的前m個大富翁.輸入 輸入包含多組測試用例.每個用例首先包含2個整數n 0 輸出 請輸出烏鎮前m個大富翁的財產數,財產多的排前面,如果大富翁不...

題目1034 尋找大富翁

題目1034 尋找大富翁 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 7414 解決 2923 題目描述 浙江桐鄉烏鎮共有n個人,請找出該鎮上的前m個大富翁.輸入 輸入包含多組測試用例.每個用例首先包含2個整數n 0 輸出 請輸出烏鎮前m個大富翁的財產數,財產多的排前面,如果大富翁不...

程式設計題目 尋找醜數

題目 我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 例如 6 8 都是醜數,但 14 不是,因為它包含因子 7。習慣上我們把 1 當做是第乙個醜數。求按從小到大的順序的第 1500 個醜數。思路 1.數字從1遞增,判斷是不是醜數 2.用2 3 5分別乘以已有的醜數,用大於當...