mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
|
#include<stdio.h>
|
||
|
#include<iostream>
|
||
|
#include<map>
|
||
|
#include<algorithm>
|
||
|
#include<string.h>
|
||
|
#include<stdlib.h>
|
||
|
#define MAXN 1005
|
||
|
using namespace std;
|
||
|
double dp[55][MAXN], cost[MAXN][MAXN];
|
||
|
map<int ,double> has;
|
||
|
struct Info{
|
||
|
double pos;
|
||
|
double p;
|
||
|
}info[MAXN];
|
||
|
int main()
|
||
|
{
|
||
|
int N, M, i, n, a, j, k, pos;
|
||
|
double l, r, suml, sumr;
|
||
|
double b, min, temp, t;
|
||
|
while(scanf("%d%d",&N, &M)&&(N + M))
|
||
|
{
|
||
|
has.clear();
|
||
|
for( i = 1; i <= N; ++ i )
|
||
|
{
|
||
|
scanf("%d", &n);++n;
|
||
|
while(--n)
|
||
|
{
|
||
|
scanf("%d%lf", &a, &b);
|
||
|
has[a]+=b;
|
||
|
}
|
||
|
}
|
||
|
N = 0;
|
||
|
for(map<int, double>::iterator it = has.begin(); it != has.end(); ++it)
|
||
|
{
|
||
|
info[++N].pos = it->first;
|
||
|
info[N].p = it->second;
|
||
|
}
|
||
|
for(j = N; j >= 1; j--)
|
||
|
{
|
||
|
pos = j;
|
||
|
cost[j][j] = 0;
|
||
|
l = r = suml = 0;
|
||
|
sumr = info[j].p;
|
||
|
for(k = j-1; k >= 1; --k )
|
||
|
{
|
||
|
suml += info[k].p;
|
||
|
l += (info[pos].pos-info[k].pos) * info[k].p;
|
||
|
temp = l + r;
|
||
|
while((pos > 1)&&(temp>(t = (l + r + (sumr - suml) * (info[pos].pos - info[pos - 1].pos)))))
|
||
|
{
|
||
|
l -= suml * (info[pos].pos - info[pos - 1].pos);
|
||
|
r += sumr * (info[pos].pos - info[pos - 1].pos);
|
||
|
--pos;
|
||
|
suml -= info[pos].p;
|
||
|
sumr +=info[pos].p;
|
||
|
temp = t;
|
||
|
}
|
||
|
cost[k][j] = temp;
|
||
|
}
|
||
|
}
|
||
|
for(i = 1; i <= N; i++)dp[0][i] = 1e300;
|
||
|
for(i = 0; i <= M; i++)dp[i][0] = 0;
|
||
|
for(i = 1; i <= M; i++)
|
||
|
{
|
||
|
for(j = N; j >= 1; j--)
|
||
|
{
|
||
|
min = dp[i-1][j-1] + cost[j][j];
|
||
|
for(k = j-1; k >= 1; --k )
|
||
|
{
|
||
|
if(dp[i - 1][k - 1] + cost[k][j] < min)min = dp[i - 1][k - 1] + cost[k][j];
|
||
|
}
|
||
|
dp[i][j] = min;
|
||
|
}
|
||
|
}
|
||
|
printf("%0.2lf\n",dp[M][N]);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|