「中山纪中集训省选组D4T1」折射伤害 高斯消元
题目描述
在一个游戏中有n个英雄,初始时每个英雄受到数值为ai的伤害,每个英雄都有一个技能“折射”,即减少自己受到的伤害,并将这部分伤害分摊给其他人。对于每个折射关系,我们用数对来表示将自己受到伤害去掉的比例,将这些伤害转移给(是整数,是实数)。
求出经过反复折射后最后每个英雄受到的实际总伤害。
输入格式
第一行一个正整数:,表示有个英雄,第二行个整数,依次表示每个英雄受到的初始伤害。第三行一个正整数,表示有对折射关系。接下来行,每行三个数,表示将自己受到伤害去掉的比例,将这些伤害转移给。
输出格式
输出行,第行表示第个英雄最后受到的实际总伤害。保留六位小数。
样例
样例输入
3
1 0 2
3
1 2 0.3000
1 2 0.2000
2 1 0.5000
样例输出
0.666667
0.333333
2.000000
数据范围
题解
设为分摊伤害后最终受到的伤害,为自己真实受到的的伤害占总伤害的比例,表示总共分给的伤害的比例。
那么中除了第一次天降的伤害,其他伤害都是来源于别人的分摊,那么可以很轻松地推出一个式子:
直接按照这个式子建立关于的方程组,然后高斯消元解方程即可。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 205
#define M 20005
#define eps 1e-6
int n, m, A[N];
long double val[N][N], mat[N][N];
long double ans[N];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &A[i]), val[i][i] = 1;
int x, y;
double c;
scanf("%d", &m);
for (int i = 1; i <= m; i++)
{
scanf("%d%d%lf", &x, &y, &c);
val[x][y] += c;
val[x][x] -= c;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
if (i != j)
mat[i][j] = -val[j][i] / val[j][j];
mat[i][i] = 1 / val[i][i];
mat[i][n + 1] = -A[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
if (fabs(mat[j][i]) > eps)
{
for (int k = i; k <= n + 1; k++)
swap(mat[i][k], mat[j][k]);
break;
}
long double s = mat[i][i];
for (int j = i; j <= n + 1; j++)
mat[i][j] /= s;
for (int j = i + 1; j <= n; j++)
{
s = mat[j][i];
for (int k = i; k <= n + 1; k++)
mat[j][k] -= s * mat[i][k];
}
}
ans[n + 1] = 1;
for (int i = n; i >= 1; i--)
for (int j = i + 1; j <= n + 1; j++)
ans[i] -= mat[i][j] * ans[j];
for (int i = 1; i <= n; i++)
printf("%.6lf\n", double(ans[i]));
}
作者:ModestStarlight
出处:http://www.cnblogs.com/ModestStarlight/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
数学 - 高斯消元
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现