关于long double
查看原帖
关于long double
1236247
weiziao楼主2024/9/19 22:20

如图,这份代码可以正常通过本题:

#include<bits/extc++.h>
using namespace std;
#define ld double

const int N=2048,M=512,K=1024;
int n,m,v,e,c[N],d[N],g[M][M];
ld k[N],dp[N][N][2],res;
inline void FloYd(){
	for(int k=1;k<=v;k++){
		for(int i=1;i<=v;i++){
			for(int j=1;j<=v;j++){
				g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
			}
		}
	}
}

int main(){
//	freopen("P1850_1.in","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	memset(g,0x3f,sizeof g);
	cin>>n>>m>>v>>e;
	for(int i=1;i<=n;i++)cin>>c[i];
	for(int i=1;i<=n;i++)cin>>d[i];
	for(int i=1;i<=n;i++)cin>>k[i];
	for(int i=1;i<=e;i++){
		int x,y,z;cin>>x>>y>>z;
		g[x][y]=min(g[x][y],z);
		g[y][x]=min(g[y][x],z);
	}
	FloYd();
	for(int i=1;i<=v;i++)g[i][i]=g[0][i]=g[i][0]=0;
	memset(dp,0x43,sizeof dp);
	dp[1][0][0]=dp[1][1][1]=0;
	for(int i=2;i<=n;i++){
		dp[i][0][0]=dp[i-1][0][0]+g[c[i-1]][c[i]];
		for(int j=1;j<=min(n,m);j++){
			dp[i][j][0]=min(dp[i][j][0],min(dp[i-1][j][0]+g[c[i-1]][c[i]],
				dp[i-1][j][1]+g[d[i-1]][c[i]]*k[i-1]+g[c[i-1]][c[i]]*(1.0-k[i-1])));
			dp[i][j][1]=min(dp[i][j][1],min(dp[i-1][j-1][0]+g[c[i-1]][c[i]]*(1-k[i])
				+g[c[i-1]][d[i]]*k[i],dp[i-1][j-1][1]+g[d[i-1]][d[i]]*k[i]*k[i-1]+
				g[d[i-1]][c[i]]*k[i-1]*(1.0-k[i])+g[c[i-1]][d[i]]*k[i]*(1.0-k[i-1])+
				g[c[i-1]][c[i]]*(1.0-k[i])*(1.0-k[i-1])));
//			cerr<<fixed<<setprecision(2)<<dp[i-1][j][0]<<'\n';
//			cerr<<fixed<<setprecision(2)<<g[c[i-1]][c[i]]<<'\n';
//			cerr<<fixed<<setprecision(2)<<dp[i-1][j][0]+g[c[i-1]][c[i]]<<'\n';
//			cerr<<fixed<<setprecision(2)<<dp[i-1][j][1]+g[d[i-1]][c[i]]*k[i-1]+g[c[i-1]][c[i]]*(1.0-k[i-1])<<'\n';
//			cerr<<fixed<<setprecision(2)<<dp[i][j][0]<<' '<<dp[i][j][1]<<'\n';
			
		}
	}
	
	res=1e18;
	for(int i=0;i<=m;i++)res=min(res,min(dp[n][i][0],dp[n][i][1]));
	cout<<fixed<<setprecision(2)<<res<<'\n';
}
/*
暴力出奇迹,卡常能AC。
Violent makes miracle,pursuing better constant can AC.
多测不清空,OI见祖宗。
multitesting without clearing,oier meets the LCA.
十年OI一场空,不开LL见祖宗。
Ten years of OI just AFO,no #define int long long sees the LCA.
似是神犇成才处,实为蒟蒻黄泉路。
It is likely to be the Au medal for the big old,but in fact it is the Si medal for me.
黄题有恨无正解,码力不若小学生。
A yellow problem I can't AC,codeforces is not as NB as HNO3(Dilute nitric acid).
今生无奈入OI,来世不做信竞人。
This life I am a Siliy Being in oi,next life I won't f**k the sh*t of infomatics.
*/

但是,把代码中的 #define ld double换成 #define ld long double,也就是把程序中的所有浮点类型使用long double,就会不过样例;

使用cerr语句输出程序运行过程中的一些值,可以发现出现了nan导致异常。

所以为什么使用double可以通过,换成long double就会出现一些问题?是long double的不完善,还是某种bug/特性?

2024/9/19 22:20
加载中...