社区讨论

蒟蒻求助 orz

P1850[NOIP 2016 提高组] 换教室参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi7crxvj
此快照首次捕获于
2025/11/20 19:33
4 个月前
此快照最后确认于
2025/11/20 19:33
4 个月前
查看原帖
CPP


#include<iostream>
#include<cstdio>
using namespace std;
const int INF=1e8;
int d[2105],c[2105];
double f[2105][2105][2];
int dis[2105][2105];
double k[2105];

int main()
{
	int n,m,v,e;
	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<=v;i++)
	{
		for(int j=1;j<i;j++)
		{
			dis[i][j]=dis[j][i]=INF;
		}
	}
	int x,y,z;
	for(int i=1;i<=e;i++)
	{
		cin>>x>>y>>z;
		dis[x][y]=min(dis[x][y],z);
		dis[y][x]=dis[x][y];
	}
	
	for(int l=1;l<=v;l++)
	{
		for(int i=1;i<=v;i++)
		{
			for(int j=1;j<i;j++)
			{
				if(dis[i][j]>dis[i][l]+dis[l][j])
				{
					dis[j][i]=dis[i][j]=dis[i][l]+dis[l][j];
				}
				//dis[j][i]=dis[i][j]=min(dis[i][j],dis[i][l]+dis[l][j]);
			//	dis[j][i]=dis[i][j];
			}
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			f[i][j][1]=INF;
			f[i][j][0]=INF;
		}
	}
	f[1][0][0]=0;
	f[1][1][1]=0;  //初始化为0 
	for(int i=2;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			f[i][j][0]=min(f[i-1][j][0]+dis[c[i-1]][c[i]],f[i-1][j][1]+k[i-1]*dis[d[i-1]][c[i]]+(1-k[i-1])*dis[c[i-1]][c[i]]);
			if(j!=0)
			{
				f[i][j][1]=min(f[i-1][j][0]+k[i]*dis[c[i-1]][d[i]]+(1-k[i])*dis[c[i-1]][c[i]],f[i-1][j-1][1]+k[i-1]*k[i]*dis[d[i-1]][d[i]]+k[i-1]*(1-k[i])*dis[d[i-1]][c[i]]+(1-k[i-1])*k[i]*dis[c[i-1]][d[i]]+(1-k[i-1])*(1-k[i])*dis[c[i-1]][c[i]]);
			}
		}
	}
	
	//cout<<endl;
	//for(int i=1;i<=v;i++)
	//{
	//	for(int j=1;j<=v;j++)
	//	{
	//		cout<<dis[i][j]<<" ";
	//	}
	//	cout<<endl;
	//}
	double ans=INF;
	//cout<<ans<<endl;
	for(int i=0;i<=m;i++)
	{
		for(int j=0;j<=1;j++)
		{
			ans=min(ans,f[n][i][j]);
		}
	}
	//cout<<ans;
	printf("%.2lf",ans);
	return 0;
}
只拿了40分 不知道哪里错了,dalao帮忙看一下QAQ

回复

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

正在加载回复...