1. 程式人生 > >計算客模擬賽1、小區劃分

計算客模擬賽1、小區劃分

-o base theme all mbo 數位 guid esp mat

小區劃分

  • 1000ms
  • 262144K

一條街道的兩側各連續坐落著 NN 座單元樓。現在要為這些單元樓劃分居民校區。

規則如下:

  1. 每個小區只能由同一側連續的若幹座單元樓組成。且兩側都恰有 KK 個小區(每個小區至少有一棟樓)。

  2. 兩側的小區劃分規則應該相同,比如,若左邊的房子被分成 \{1,2\},\{3\}{1,2},{3} 這兩個小區,那麽右邊也應該如此。

這樣兩邊合計一共有 KK 對小區。

a_i,b_ia?i??,b?i?? 表示左右兩邊每座樓的人口在同側所有單元樓總人口中所占的百分比,定義一個小區的相對擁擠程度為其人口百分比之和(左邊就是對應 a_ia?i?? 的和,右邊是對應 b_ib?i?? 的和)。定義這條街道的總擁擠程度為左右兩邊 KK 對小區的相對擁擠程度之差的絕對值之和。

現在,請你求出可能的最大擁擠程度。

輸入格式

第一行兩個整數 NN 和 kk。

第二行 NN 個實數,第 ii 個數為 a_ia?i??。

第三行 NN 個實數,第 ii 個數位 b_ib?i??。

輸出格式

一個實數,表示這條街道的最大相對擁擠程度,保留到小數點後六位。

數據範圍與約定

對於 30\%30% 的數據:n \le 20n20。

對於 100\%100% 的數據:n \le 800,k \le 80,k \le nn800,k80,kn。

保證 \sum a_i=1, \sum b_i=1a?i??=1,b?i??=1。

樣例解釋

11 號樓一個小區,(2,3)(2,3) 號樓 11 個小區。

這樣相對擁擠程度最大為 abs(0.1 - 0.4) + abs(0.75 + 0.15 - (0.3 + 0.3))=0.6abs(0.10.4)+abs(0.75+0.15(0.3+0.3))=0.6。

樣例輸入

3 2
0.1 0.75 0.15
0.4 0.3 0.3

樣例輸出

0.600000

code

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4
#include<cstring> 5 6 using namespace std; 7 8 const int MAXN = 810; 9 double f[MAXN][85]; 10 double a[MAXN],b[MAXN],sum1[MAXN],sum2[MAXN]; 11 12 int main() { 13 int n,m; 14 scanf("%d%d",&n,&m); 15 for (int i=1; i<=n; ++i) scanf("%lf",&a[i]),sum1[i] = sum1[i-1]+a[i]; 16 for (int i=1; i<=n; ++i) scanf("%lf",&b[i]),sum2[i] = sum2[i-1]+b[i]; 17 18 for (int i=1; i<=n; ++i) { 19 f[i][1] = abs(sum1[i]-sum2[i]); 20 for (int j=2; j<=m&&j<=i; ++j) { 21 for (int k=j-1; k<i; ++k) { 22 f[i][j] = max(f[i][j],f[k][j-1]+fabs(sum1[i]-sum1[k]-sum2[i]+sum2[k])); 23 } 24 } 25 } 26 printf("%.6lf",f[n][m]); 27 return 0; 28 }

計算客模擬賽1、小區劃分