求调玄关
查看原帖
求调玄关
359883
Grace25楼主2024/8/7 08:05
#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n,k;
double dp[N][N],sum[N][N];
struct state{
	double a,b;
}s[N],t[N];
bool cmpa(state x,state y){
	return x.a<y.a;
}
bool cmpb(state x,state y){
	return x.b<y.b;
}
int main(){
	cin >> n >> k;
	for(int i=1;i<=n;i++){
		cin >> s[i].a >> s[i].b;
		if(s[i].b < 0) s[i].b=1e18;
	}
	sort(s+1,s+n+1,cmpb);
	for(int i=n;i>=1;i--){
		for(int j=1;j<=n;j++) t[j]=s[j];
		sort(t+i+1,t+n+1,cmpa);
		for(int j=1;j<=n-i+1;j++) sum[i][j]=sum[i][j-1]+t[i+j-1].a;
	}
	double ans=1e18;
	for(int b=0;b<k;b++){
		memset(dp,0x7f,sizeof(dp));	
		dp[0][0]=0.0;
		for(int i=1;i<=k;i++){
			double cst=double(s[i].a/(b+1));
			dp[i][0]=dp[i-1][0]+cst;
			for(int j=1;j<=i;j++)
				dp[i][j]=min(dp[i-1][j-1]+double(s[i].b/j),dp[i-1][j]+cst);
		}
		for(int i=0;i<=k;i++) ans=min(ans,dp[i][b]+double(sum[i+1][k-i]/(b+1)));
	}
	printf("%.15lf",ans);
	return 0;
} 
2024/8/7 08:05
加载中...