DP80pts求助
查看原帖
DP80pts求助
226523
RAYMOND_7楼主2020/10/29 22:25

本蒟蒻用dp写的,过不掉,80,求助。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
void read(int &x){
	char c=getchar();
	int k=1;
	while(c<'0'||c>'9') {if(c=='-') k=-1;c=getchar();}
	for(x=0;c>='0'&&c<='9';c=getchar())
	x=x*10+c-'0';
	x*=k;
}
const int N=1005;
int n,m,x,y,l,r,p,k,c[N],d[N];
struct fox{
	int time,deli;
}a[N];
double f[N][N],s,ans,g[N][N],q[N][N];
bool operator<(fox x,fox y){
	return 1.0*x.deli/x.time<1.0*y.deli/y.time;
}
int main(){
//	freopen("time.in","r",stdin);
//	freopen("time.out","w",stdout);
	read(n);read(m);
	for(int i=1;i<=n;i++) read(a[i].deli);
	for(int i=1;i<=n;i++) read(a[i].time);
	sort(a+1,a+n+1);
	for(int i=1;i<=n;++i){
		c[i]=a[i].deli;d[i]=a[i].time;
	}
	for(int i=1;i<=n;i++){
		q[i][1]=c[i]*1.0/d[i];
		f[i][1]=c[i];g[i][1]=d[i];
		for(int j=2;j<=i;++j){
			for(int k=1;k<i;++k){
				if(k<j-1) continue;
				if(q[i][j]<(f[k][j-1]+c[i])/(g[k][j-1]+d[i])){
					q[i][j]=(f[k][j-1]+c[i])/(g[k][j-1]+d[i]);
					f[i][j]=f[k][j-1]+c[i];
					g[i][j]=g[k][j-1]+d[i];
				}
			}
		}
	}
	printf("%.3lf",q[n][m]);
	return 0;
}

2020/10/29 22:25
加载中...