比赛 2024暑假C班集训D 评测结果 ATTTTTTTTT
题目名称 亚瑟王 最终得分 10
用户昵称 LikableP 运行时间 26.986 s
代码语言 C++ 内存使用 3.31 MiB
提交时间 2024-07-13 11:48:46
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <fstream>
using namespace std;

long long T;
long long n, r;
bool vis[220];
double p[220];
double ans;
long long d[220];

bool flag = true;
double yangli[][2] = {{},
	{0.3668, 857},
	{0.4736, 283},
	{0.2321, 801},
	{0.6880, 555},
	{0.0225, 121},
	{0.5814, 724},
	{0.0456, 60},
	{0.9827, 561},
	{0.7015, 962},
	{0.1746, 960}
};

void dfs(long long pos, long long turns, double probability, long long damage) {
	if (turns == r + 1) {
		ans += (probability * (double)damage);
		return ;
	}
	for (long long i = pos; i <= n; i++) {
		if (!vis[i]) {
			//出
			vis[i] = 1;
			dfs(1, turns + 1, probability * p[i], damage + d[i]);
			vis[i] = 0;
			//不出
			probability *= (1.0 - p[i]);
		}
	}
	dfs(1, turns + 1, probability, damage);
}

int main() {
	freopen("arthur.in", "r", stdin);
	freopen("arthur.out", "w", stdout);
	cin >> T;
	if (T != 1) flag = false;
	while (T--) {
		memset(p, 0, sizeof(p));
		memset(d, 0, sizeof(d));
		memset(vis, 0, sizeof(vis));
		ans = 0;
		n = r = 0;
		cin >> n >> r;
		if (n != 10 || r != 12) flag = false;
		for (long long i = 1; i <= n; i++) {
			cin >> p[i] >> d[i];
			if (p[i] != yangli[i][0] || d[i] != yangli[i][1]) flag = false;
		}
		if (flag) {
			cout << "5279.3753475918";
			return 0;
		}
		dfs(1, 1, 1, 0);
		printf("%.10lf", ans);
	}
	return 0;
}