样例没过求助
查看原帖
样例没过求助
361726
追梦之鲸楼主2022/11/18 19:41

RT,调了两三天了QwQ

#include <bits/stdc++.h>
using namespace std;

template <class T>
inline void Read(T &x) {int f=1;x=0;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=x*10+(c^48);x*=f;}
template <class S>
inline void Sead(S &x) {char c=getchar();for(;(c>'Z'||c<'A')&&(c>'z'||c<'a');c=getchar());for(;(c<='Z'&&c>='A')||(c<='z'&&c>='a');c=getchar())x=x+c;}

const int N = 2333;

double kry[N], f[N][N][2];
int cry[N][2], dis[N][N];
int n, m, v, k; 

inline void Floyd() {
	for (int k = 1; k <= v; k ++)
		for (int i = 1; i <= v; i ++)
			for (int j = 1; j <= v; j ++)
				dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
	return ;
}
inline void init() {
	memset(dis, 0x3f, sizeof dis);
	memset(f, (double)0x3f, sizeof f);
	f[1][0][0] = 0.0;
	f[1][1][1] = 0.0;
	return ;
}

int main() {
	init();
	Read(n); Read(m); Read(v); Read(k);
	for (int i = 1; i <= n; i ++) {
		Read(cry[i][0]);
	}
	for (int i = 1; i <= n; i ++) {
		Read(cry[i][1]);
	} 
	for (int i = 1; i <= n; i ++) {
		scanf("%lf", &kry[i]);
	}
	for (int i = 1, x, y, z; i <= k; i ++) {
		Read(x); Read(y); Read(z);
		dis[x][y] = min(dis[x][y], z);
		dis[y][x] = min(dis[y][x], z);
	}
	Floyd();
//	for (int i = 1; i <= n; i ++) {
//		for (int j = 1; j <= n; j ++) {
//			printf("%d ", dis[i][j]);
//		}
//		printf("\n");
//	}
//	for (int i = 1; i <= n; i ++) {
//		printf("%.2f ", kry[i]);
//	}
//	cout << endl;
	for (int i = 2; i <= n; i ++) {
		f[i][0][0] = f[i - 1][0][0] + dis[cry[i - 1][0]][cry[i][0]];
		printf("%.2f\n", f[i][0][0]);
		for (int j = 1; j <= min(i, m); j ++) {
			f[i][j][0] = min(
							f[i - 1][j][0] + 
							dis[cry[i - 1][0]][cry[i][0]], 
							f[i - 1][j][1] + 
							kry[i - 1] * 			dis[cry[i - 1][1]][cry[i][0]] + 
							(1.0 - kry[i - 1]) * 	dis[cry[i - 1][0]][cry[i][0]]);
//			cout << f[i - 1][j][0] + dis[cry[i - 1][0]][cry[i][0]] << "  &&&&&&&&  " << f[i - 1][j][1] + kry[i - 1] * dis[cry[i - 1][1]][cry[i][0]] + (1.0 - kry[i - 1]) * dis[cry[i - 1][0]][cry[i][0]] << endl;
			printf("%.2f ", f[i][j][0]);
			f[i][j][1] = min(
							f[i - 1][j - 1][0] + 
							kry[i] * 				dis[cry[i - 1][0]][cry[i][1]] + 
							(1.0 - kry[i]) * 		dis[cry[i - 1][0]][cry[i][0]], 
							
							f[i - 1][j - 1][1] + 
							kry[i - 1] * kry[i] * 					dis[cry[i - 1][1]][cry[i][1]] + 
							kry[i - 1] * (1.0 - kry[i]) * 			dis[cry[i - 1][1]][cry[i][0]] + 
							(1.0 - kry[i - 1]) * kry[i] * 			dis[cry[i - 1][0]][cry[i][1]] + 
							(1.0 - kry[i - 1]) * (1.0 - kry[i]) * 	dis[cry[i - 1][0]][cry[i][0]]);
//			cout << f[i - 1][j - 1][0] + kry[i] * dis[cry[i - 1][0]][cry[i][1]] + (1.0 - kry[i]) * dis[cry[i - 1][0]][cry[i][0]] << "  &&&&&&&&  " << f[i - 1][j - 1][1] + kry[i - 1] * kry[i] * dis[cry[i - 1][1]][cry[i][1]] + kry[i - 1] * (1.0 - kry[i]) * dis[cry[i - 1][1]][cry[i][0]] + (1.0 - kry[i - 1]) * kry[i] * dis[cry[i - 1][0]][cry[i][1]] + (1.0 - kry[i - 1]) * (1.0 - kry[i]) * dis[cry[i - 1][0]][cry[i][0]] << endl;
				
				printf("%.2f\n", f[i][j][1]);
		}
	}
	double ans = 1e9 + 7;
	for (int i = 0; i <= m; i ++) {
		ans = min(ans, min(f[n][i][0], f[n][i][1]));
	}
	printf("%.2f", ans - 5e-3);
	return 0;
}
/*
4.00
4.00 3.60
4.00 3.60
8.00
7.20 4.60
7.20 8.20
*/
2022/11/18 19:41
加载中...