社区讨论

可以用double吗

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhjdnf6z
此快照首次捕获于
2025/11/04 00:51
4 个月前
此快照最后确认于
2025/11/04 00:51
4 个月前
查看原帖
为什么没过样例,换long long就可以A
CPP
#include<bits/stdc++.h>
#define db double
#define f(i,b,e) for(int i=b;i<=e;i++)
using namespace std;
int n;
db x0,dp[2][1005][1005],w[1005][1005],qzh[1005];
struct node{db x,y,v;}a[1005];
int main(){
	scanf("%d%lf",&n,&x0);a[n+1].x=x0;
	f(i,1,n)
		scanf("%lf",&a[i].x);
	f(i,1,n)
		scanf("%lf",&a[i].y);
	f(i,1,n)
		scanf("%lf",&a[i].v); n++;
	sort(a+1,a+1+n,[](node xx,node yy){return xx.x<yy.x;});
	f(i,1,n) qzh[i]=qzh[i-1]+a[i].v;
	f(i,1,n) f(j,i,n) w[i][j]=qzh[n]-(qzh[j]-qzh[i-1]);
	int tt=0;
	f(i,1,n){
		if(x0==a[i].x){
			tt=i;
			break;
		}
	}
	memset(dp,-0x7f7f7f7f,sizeof(dp));
	//dp[0][i][j]=dp[0][i+1][j]+a[i].y-w[i+1][j]*(a[i+1].x-a[i].x);
	//dp[1][i][j]=dp[1][i][j-1]+a[j].y-w[i][j-1]*(a[j].x-a[j-1].x);
	dp[0][tt][tt]=dp[1][tt][tt]=0;
	f(len,2,n){
		f(i,1,n-len+1){
			int j=i+len-1;
			dp[0][i][j]=max(dp[0][i][j],dp[0][i+1][j]+a[i].y-w[i+1][j]*(a[i+1].x-a[i].x));
			dp[0][i][j]=max(dp[0][i][j],dp[1][i+1][j]+a[i].y-w[i+1][j]*(a[j].x-a[i].x));
			
			dp[1][i][j]=max(dp[1][i][j],dp[1][i][j-1]+a[j].y-w[i][j-1]*(a[j].x-a[j-1].x));
			dp[1][i][j]=max(dp[1][i][j],dp[0][i][j-1]+a[j].y-w[i][j-1]*(a[j].x-a[i].x));
		}
	}
	printf("%.3lf\n",max(dp[1][1][n],dp[0][1][n])/1000.00);
	return 0;
}

回复

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

正在加载回复...