社区讨论

10pts AC on #11求条

P2466[SDOI2008] Sue 的小球参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mliu7qju
此快照首次捕获于
2026/02/12 10:26
4 周前
此快照最后确认于
2026/02/14 15:30
3 周前
查看原帖
代码
CPP
//P2466 [SDOI2008] Sue 的小球 
//难度:蓝  解法:区间dp 
#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y,v;
}a[1010];
long long n,x0;
long long dp[1010][1010][2];
long long t[1010][1010][2];
bool cmp(node x,node y){
	return x.x<y.x;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	memset(t,0xff,sizeof(t));
	cin>>n>>x0;
	for(int i=1;i<=n;i++){
		cin>>a[i].x;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i].y;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i].v;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		t[i][i][0]=abs(x0-a[i].x);
		t[i][i][1]=abs(x0-a[i].x);
		dp[i][i][0]=a[i].y-t[i][i][0]*a[i].v;
		dp[i][i][1]=a[i].y-t[i][i][1]*a[i].v;
	}
	for(int len=2;len<=n;len++){
		for(int l=1;l<=n-len+1;l++){
			int r=l+len-1;
			t[l][r][0]=min(t[l+1][r][0]+abs(a[l+1].x-a[l].x),t[l+1][r][1]+abs(a[r].x-a[l].x));
			t[l][r][1]=min(t[l][r-1][0]+abs(a[l].x-a[r].x),t[l][r-1][1]+abs(a[r-1].x-a[r].x));
			dp[l][r][0]=dp[l+1][r][0]+(a[l].y-t[l][r][0]*a[l].v);
			dp[l][r][1]=dp[l][r-1][0]+(a[r].y-t[l][r][1]*a[r].v);
			
		}
	}
	printf("%.3f",max(dp[1][n][0],dp[1][n][1])*0.001);
}
/*
是否可能 时间更长但路程更短?不可能 
*/

回复

0 条回复,欢迎继续交流。

正在加载回复...