题目描述

在一个游戏中有n个英雄,初始时每个英雄受到数值为ai的伤害,每个英雄都有一个技能“折射”,即减少自己受到的伤害,并将这部分伤害分摊给其他人。对于每个折射关系,我们用数对\((x_i,y_i,z_i)\)来表示\(x_i\)将自己受到伤害去掉\(z_i\)的比例,将这些伤害转移给\(y_i\)(\(x_i,y_i\)是整数,\(z_i\)是实数)。

求出经过反复折射后最后每个英雄受到的实际总伤害。

输入格式

第一行一个正整数:\(n\),表示有\(n\)个英雄,第二行\(n\)个整数\(A_i\),依次表示每个英雄受到的初始伤害。第三行一个正整数\(m\),表示有\(m\)对折射关系。接下来\(m\)行,每行三个数\(x_i,y_i,z_i\),表示\(x_i\)将自己受到伤害去掉\(z_i\)的比例,将这些伤害转移给\(y_i\)。

输出格式

输出\(n\)行,第\(i\)行表示第\(i\)个英雄最后受到的实际总伤害。保留六位小数。

样例

样例输入

3
1 0 2
3
1 2 0.3000
1 2 0.2000
2 1 0.5000

样例输出

0.666667
0.333333
2.000000

数据范围

题解

设\(D_i\)为分摊伤害后\(i\)最终受到的伤害,\(C_i\)为\(i\)自己真实受到的的伤害占总伤害的比例,\(T_{i,j}\)表示\(i\)总共分给\(j\)的伤害的比例。

那么\(D_i\)中除了第一次天降的伤害\(A_i\),其他伤害都是来源于别人的分摊,那么可以很轻松地推出一个式子:

\[\frac{D_i}{C_i}=\sum_{j≠i}\frac{D_j}{C_j}\cdot T_{j,i}+A_i
\]

直接按照这个式子建立关于\(D_i\)的方程组,然后高斯消元解方程即可。

\(Code:\)

#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]));
}

「中山纪中集训省选组D4T1」折射伤害 高斯消元的更多相关文章

  1. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  2. 「中山纪中集训省选组D2T1」书堆 欧拉常数

    题目描述 蚂蚁是勤劳的动物,他们喜欢挑战极限.现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍.书是形状大小质量都一样的矩形.蚂蚁要把这些书摆在水平桌子的边缘.蚂蚁喜欢整洁的布置,所以 ...

  3. 【noi2019集训题1】 脑部进食 期望dp+高斯消元

    题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...

  4. 中山纪中集训Day5叒是测试(划淼)

    A组T1 矩阵游戏(game) 九校联考24OI__D1T1 问题描述 LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M ...

  5. 中山纪中集训Day1测试(摸鱼)

    AT3 粉刷匠 Description 赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= = 现在,神庙里有N根排列成一直线的石柱,从1到N标号,长老要求用油漆将这些石柱重新粉刷一遍.赫克托有K桶颜色各不 ...

  6. 中山纪中集训Day4双是测试(划沝) 九校联考-DL24凉心模拟Day2

    A组T1 锻造 (forging) 1.1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现......自己连一个史莱姆 ...

  7. 中山纪中集训Day2又是测试(划水)

    A组T1 bzoj 2674 Attack Description chnlich 非常喜欢玩三国志这款游戏,并喜欢用一些策略出奇制胜.现在,他要开始征服世界的旅途了.他的敌人有N 座城市和N 个太守 ...

  8. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

  9. BZOJ 2466: [中山市选2009]树( 高斯消元 )

    高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...

随机推荐

  1. Laravel —— could not find driver

    Laravel 中的数据库是以 PDO 的方式连接的 数据库连接失败时,先检查问题所在,再对症下药 本文以 pgsql 为例 1.判断 pgsql 是否启动 $ ps -ef | grep pgsql ...

  2. xshell连接不上阿里云服务器Could not connect to 'ip' (port 22): Connection failed.解决过程

    记一次xshell阿里云服务器突然连接不上的解决办法: 1, 确认阿里云服务器安全组出入都有22,百度出来都说的这个和ip拦截设置,以防万一都设置了:但楼主设置后,还是连不上服务器: 只好下一步 2, ...

  3. fullcalendar + qTip2显示事件详情

    fullcalendar 是一个很优秀的日历插件.qTip2 是一个强大的提示工具.在讲下面的功能之前,需要对fullcalendar 和 qTip2 有些了解,可直接点击下面贴出的2个地址: ful ...

  4. jsp之大文件分段上传、断点续传

    1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...

  5. chef test-kitchen Could not load the 'vagrant' driver from the load path 问题解决

    今天使用chef 的kitchen,运行kitchen list 发现了如下错误: >>>>>> ------Exception------- >>&g ...

  6. C博客作业01——分支,顺序结构

    C博客作业01--分支,顺序结构 0.展示PTA总分 1本章学习内容 1.1学习内容总结 1)格式化输出函数printf(),scanf(). 它是什么? 对于初学者而言,一开始了解接触它们,只是被硬 ...

  7. vue中使用vue-pdf插件显示pdf

    最近项目需求需要在vue中展示pdf,上网搜索了实现方法,找到vue-pdf这个插件非常好用,并且还有许多方法.属性能进行功能扩展. 一.安装 npm install --save vue-pdf 二 ...

  8. D3.js的v5版本入门教程(第八章)—— 坐标轴

    D3.js的v5版本入门教程(第八章) D3中没有现成的坐标轴图形,需要我们自己用其他组件拼凑而成.D3中提供了坐标轴组件,使得我们在SVG中绘制一个坐标轴变得像添加一个普通元素那样简单 为了表绘制一 ...

  9. SSH框架整合1

    ======================web.xml======================= <?xml version="1.0" encoding=" ...

  10. rust结构体

    //Rust 并不允许只将某个字段标记为可变 struct User { email: String, name:String, age:i32, sex:String, active:bool, } ...